【问题标题】:sublists of a list with possitive sum总和为正的列表的子列表
【发布时间】:2012-11-16 18:34:36
【问题描述】:

我正在尝试查找具有以下 2 个属性的列表的子列表(至少有一个正整数) 1. 元素之和为正 2. 总和为正的所有其他子列表的最大长度

我只对那个列表的长度感兴趣。 Kadane 的算法在 O(n) 时间内找到总和最大的子列表。有没有一种算法可以在 O(n) 中做同样的事情?我找到了一个解决方案,但它确实会计算所有子列表,而且速度当然非常慢....

感谢您的宝贵时间

【问题讨论】:

  • 元素是否需要相邻?换句话说,如果我有[10, 8, -8],是否存在解决方案?
  • 是的元素需要相邻,在 [10,8,-8] 列表本身是一个可接受的解决方案(具有最大长度的)和子列表 [8,-8],[ 10,8] 。 (对于总和大于或等于零的情况的解决方案非常受欢迎。)

标签: array-algorithms


【解决方案1】:

计算所有数字的总和,说它是n。 如果 n > 0 则返回完整列表作为答案。 别的 继续从两端修剪较小的元素并从总和中减去,直到总和变为正数。 返回 this 作为结果。 这是一个 O(n) 算法。 希望对你有帮助

【讨论】:

    【解决方案2】:

    这里有一个可能的解决方案。您可以使用Counting sort 对数组进行排序。 在那个凝视形式之后,最大元素求和并检查是否添加了这个元素 将保留非的正和,如果它仍然是正的,则添加并递增计数向前移动。这可能对某些输入有一些错误,我的意思是它可能不适用于所有测试用例。 但是,这只是一个可能对您有所帮助的想法,因为对此进行一些改进将为您提供所需的输出。 在一个遍历计数变量结束时会给你结果。 示例:

    array=[12,10,8,5,4,-2,-3,-20,-30] //considered already sorted now
    i=0 sum=12 count=1
    i=1 sum=22 count=2
    i=2 sum=30 count=3
    i=3 sum=35 count=4
    i=4 sum=39 count=5
    i=5 sum=37 count=6
    i=6 sum=34 count=7
    i=7 sum=14 count=8
    i=8 sum=14 count=8 //as now 30 cant be added
    so, here count=8 says maximum length sub array of 8 can give you positive sum.
    

    【讨论】:

      【解决方案3】:

      好的,你几乎已经回答过了。只需修改 Kadane 以使用子序列的长度而不是子序列的总和。这解决了你的问题。这是来自维基百科的 Kadane:

      int sequence(int numbers[])    
      { 
          // These variables can be added in to track the position of the subarray
          size_t begin = 0;
          size_t begin_temp = 0;
          size_t len_temp = 0;
          size_t end = 0;
      
          // Find sequence by looping through
          for(size_t i = 1; i < numbers.size(); i++)
          {
                  // calculate max_ending_here
                  if(max_ending_here < 0)
                  {
                          max_ending_here = numbers[i]; 
                          begin_temp = i;
                  }
                  else
                  {
                          max_ending_here += numbers[i];
                          len_temp += (i - begin_temp);
                  }
      
                  // calculate max_so_far_len
                  if(len_temp >= max_so_far_len )
                  {
                          max_so_far_len  = len_temp; 
                          begin = begin_temp;
                          end = i;
                  }
          }
          return max_so_far_len ;
      

      }

      【讨论】:

        【解决方案4】:

        由于在您的回答中您将子列表视为后续元素,我想对 Kadane 的算法稍作修改会对您有用。 只需引入一个名为 ma​​x_length_till_now 的变量。并在您发现长度大于当前值的子列表时更新它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-26
          • 2012-10-31
          • 2013-02-10
          • 2019-03-22
          • 1970-01-01
          • 2023-01-11
          • 2023-01-12
          • 2016-04-23
          相关资源
          最近更新 更多