具有正和的列表的子列表

时间:2012-11-16 18:34:36

标签: array-algorithms

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

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

谢谢你的时间

4 个答案:

答案 0 :(得分:0)

计算所有数字的总和,说它是n。 如果n> 0然后返回完整列表作为答案。 其他 保持从两端修剪较小的元素并从总和中减去直到总和变为正。 返回此结果。 它是一种O(n)算法。 希望它有所帮助

答案 1 :(得分:0)

这里有一个可能的解决方案。您可以使用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.

答案 2 :(得分:0)

好的,你几乎已经回答了。只需修改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 ;

}

答案 3 :(得分:0)

因为在你的回答中你认为子列表是结果元素,我想在Kadane的Algo中稍作修改对你有用。 只需引入一个名为 max_length_till_now 的变量。每当您找到长度大于其当前值的子列表时,请更新它。