找到特定值的最长序列

时间:2011-04-01 10:44:36

标签: algorithm math

我想找到一个特定数字的最长序列,即1出现在数组中。假设数组是{1,0,0,0,1,1,1,1,0,0,1,1};答案应为4,因为连续出现最多四次。

5 个答案:

答案 0 :(得分:6)

使用run length encoding

R中,它只是

max(rle(x)$lengths)

答案 1 :(得分:3)

从一组数字A开始,找到最长的数字 在A中连续运行一些N.

伪C ......

MaxRun = 0 /* Longest run so far */
for (i = 0; i < length(A);) {
  if A[i] = N {
    /* Potential run of N's... */

    /* Scan backward for first N in run */
    for (j = i; j > 0 & A[j-1] = N; j--);

    /* Scan forward to last N in run */
    for (k = i; k < length(A)-1 & A[k+1] = N; k++);

    /* Check to see if longer run found... */
    if (k-j+1 > MaxRun) then MaxRun = k-j+1;

    i = k /* jump i to last N found */
  }
  i = i + MaxRun + 1 /* Jump by longest run plus 1 */
}

MaxRun就是答案

这个想法是,一旦你发现N的连续运行,你就可以 在检查之前至少向前跳到阵列中的那个远处 另一位候选人。

由于跳跃因子,该算法具有可能的次线性运行时间。最糟糕的情况是每个A [i]都会被检查。

答案 2 :(得分:1)

会有更有效的方法,但这就是我现在所获得的(C#):

            int count = 0;
            int maxCount = 0;

            for (int i = 0; i < someArray.Count(); i++)
            {
                if (someArray[i] == 1)
                {
                    count++;
                }
                else
                {
                    if(count > maxCount)
                    {
                        maxCount = count;
                    }

                    count = 0;
                }
            }

答案 3 :(得分:0)

A =数组,L =长度

cnt = 0
max = 0
for i = 0 .. L - 1
  if A[i] == 0
    if (cnt > max) max = cnt
    cnt = 0
  else
    cnt = cnt + 1
if (cnt > max) max = cnt

答案 4 :(得分:0)

这是另一个线性解决方案,想法是维持两个跑步者。在1的起始边界处,第1个跑步者等到第2个跑步者到达终点(即0)。

int i = 0, j= 0, max = 0, n = A.length;

while ( j < n ) {

  if (j == (n-1)) { // reached boundary

    j = ( A[j] == 1) ? j++ : j;
    int k = j-i;
    if ( k > max ) { max = k;} 
  }

  else if ( A[j] == 1 ) { j++; }// increment 2nd runner

  else { 

    int k = j-i;
    if ( k > max ) { max = k;}
    j++; i = j;
  }
}

max是答案。