使用索引查找数组的最大子序列

时间:2016-10-26 17:07:03

标签: java arrays algorithm subsequence

我想在整数数组中找到最大子序列S(h,k)。我已经有了代码(在Java中)来查找最大值并且工作正常,但是如何从以下内容中获取两个索引hk

int []a = {-2, 1, -3, 4, -1, 2, 1, -5, 4 };
int max_so_far = 0, max_ending_here = 0;
for(int i=0; i<a.length; i++) {
    max_ending_here = Math.max(0, max_ending_here + a[i]);
    max_so_far = Math.max(max_so_far, max_ending_here);
}
System.out.println("The maximal sum of subsequence is = "+max_so_far)";

2 个答案:

答案 0 :(得分:0)

您可以通过存储改进后的最后一个索引max_so_far和&#34;解开&#34;来获取子序列本身。后面的序列:

int []a = {-2, 1, -3, 4, -1, 2, 1, -5, 4 };
int max_so_far = 0, max_ending_here = 0, index_max = 0;
for(int i=0; i<a.length; i++) {
    max_ending_here = Math.max(0, max_ending_here + a[i]);
    if (max_so_far < max_ending_here) {
        max_so_far = max_ending_here;
        index_max = i;
    }
}
System.out.print("The maximal sum of subsequence is = "+max_so_far);
int j = index_max;
while (j >= 0 && max_so_far > 0) {
    max_so_far -= a[j--];
}
System.out.println(", from = "+(j+1)+" to "+index_max+", inclusive");

Demo.

注意:使用标记从后面展开是动态编程算法中的常见主题。在您的简单情况下,index_max扮演一个特殊标记的角色,从中您可以向后查找将max_so_far运行为零的索引。

答案 1 :(得分:0)

感谢 Shreyas Sarvothama dasblinkenligh t的答案。我在Uekav Chokshi的geeksforgeeks.org网站上找到了一个很好的解决方案。

解决方案是:

int []a = {-2, 1, -3, 4, -1, 2, 1, -5, 4 };
int max_so_far = a[0], max_ending_here = a[0];
int curStartIndex = 0;
int maxStartIndex = 0;
int maxEndIndex = 0;

for(int i=1; i<a.length; i++) {
        max_ending_here = Math.max(a[i], max_ending_here + a[i]);
        if(max_ending_here > max_so_far){
             max_so_far = max_ending_here;
             maxStartIndex = curStartIndex;
             maxEndIndex = i;
        }
        if(max_ending_here < 0){
            curStartIndex = i+1;
        }
}