zoukankan      html  css  js  c++  java
  • The longest plateau

    Problem:

    Given an array, try to develop an efficient algorithm which can compute the length of the longest plateau. A plateau is a consecutive segment of an array with equal contents. For example, if x[] = {1, 2, 3, 4, 4, 4, 5, 5, 6}, then we have six plateaus which are 1, 2, 3, 4-4-4, 5-5 and 6. And obviously the length of the longest plateaus is 3.

    Analysis:

    Well, a straightforward idea is try to firstly compute all the length of different plateaus from left to right and then select the longest length. The pseudo-code is like this:

    for each element in the array a[]
         if a[i] is equal to a[i-1]
              add 1 to the length for the current plateau
              check whether the current length is the longest one so far
         else
              reset length to 1 // plateau length is at least 1

    Whether we need line 5&6 depends on whether we need to store the length of every plateau. If we just want to calculate the longest length then we can keep the code and use the “length” as a temp variable which is only used inside the loop. On the other hand, if we need to keep track of the length of all plateaus, we need to use an array of “length[]” to store the needed information.

    /*
     * input: an array a[], the length of the array n
     * output: the length of the longest plateau
     */
    int longestPlateau (int a[], int n)
    {
        if (n == 0)
            return 0;
     
        int length = 1;
        int longestLength = 1;
     
        for (int i = 1; i<n; i++)
        {
            if (a[i] == a[i-1])
            {
                length++;
                longestLength = max(longestLength, length);
            }
            else
                length = 1;
        }
        return longestLength;
    }

    Some more:

    What if the given array is sorted (in the increasing order) already?

    Actually if the array is sorted, the algorithm can be much simpler:

    assume the longest length now is L, then we just need to compare a[i] and a[i-L], if they are equal then all the elements between them are also equal (since this is a sorted array!), and we can add 1 to the current longest length. The code looks like this:

    /*
     * input: an sorted array a[] (increasing order), the length of the array n
     * output: the length of the longest plateau
     */
    int longestPlateau (int a[], int n)
    {
        if (n == 0)
            return 0;
     
        int length = 1;
        for (int i = 1; i<n; i++)
        {
            if (a[i] == a[i-length])
                length++;
        }
        return length;
    }
  • 相关阅读:
    ExtJS 刷新或者重载Tree后,默认选中刷新前最后一次选中的节点代码片段
    ios>APP名称的多语言化(转)
    android>apk破解以及重新编译(转)
    MFC动态库基本概念
    (内存中的)堆和栈的区别(转过无数次的文章)
    面向对象五大基本原则
    VS20052008程序发布、打包(MFC)
    在MFC中创建动态控件的生成与响应
    SQL2000自动备份数据库并发送邮件报告数据库自动备份情况
    The Concept of Callbacks
  • 原文地址:https://www.cnblogs.com/zhangjie/p/3340954.html
Copyright © 2011-2022 走看看