【问题标题】:finding longest sequence of a particular value查找特定值的最长序列
【发布时间】:2011-07-27 14:30:51
【问题描述】:

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

【问题讨论】:

  • 任何特定的语言?
  • O(n) 是微不足道的。是否可以更快地做到这一点?
  • @Jack:最坏的情况总是 O(n)。想象一下,列表中只有一个 0。你必须找到它。
  • @Sven:实际上如果列表中没有0,那就更难了。

标签: algorithm math


【解决方案1】:

使用run length encoding

R,只是

max(rle(x)$lengths)

【讨论】:

    【解决方案2】:

    从一个数字数组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] 都会被检查。

    【讨论】:

      【解决方案3】:

      会有更有效的方法,但这是我现在得到的(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;
                      }
                  }
      

      【讨论】:

      • 这将返回1的最后一个连续子序列的长度,而不是最长的。
      • 我认为加快速度的唯一方法是与 reduce 操作并行进行。
      • 这仍然有一个错误,如果最长的运行在数组的最后,它不会被考虑在内,因为 maxCount=count 仅在从数组中读取 '0' 时触发。
      【解决方案4】:

      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
      

      【讨论】:

        【解决方案5】:

        这是另一个线性解决方案,想法是保持两个跑步者。在 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;
          }
        }
        

        最大是答案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          相关资源
          最近更新 更多