给定这个数组
int [] myArray = {5,-11,2,3,14,5,-14,2};
您要在未排序的整数数组中找到任何下序列中值的最大总和。如果数组的长度为零,则maxSeqValue必须返回Integer.MIN_VALUE。
你应该打印数字19,因为最大总和的后序是14,5。 下序数是一系列不增加的数字。
这些是我使用的代码,但我想有些情况仍然没有考虑到。 任何想法,提前谢谢。
public class MaxDownSequence{
public int maxSeqValue(int[] a){
int sum=Integer.MIN_VALUE;
int maxsum=Integer.MIN_VALUE;
for (int i=1;i<a.length;i++){
if(a[i]<a[i-1]){
sum = a[i] + a[i-1];
if (sum>maxsum){
maxsum=sum;
}
}
else {
sum=a[i];
if (sum>maxsum){
maxsum=sum;
}
}
}
if (a.length==0){
return Integer.MIN_VALUE;
}
else{
return maxsum;
}
}
public static void main(String args[]){
MaxDownSequence mySeq = new MaxDownSequence();
int [] myArray = {5,-11,2,3,14,5,-14,2};
System.out.println(mySeq.maxSeqValue(myArray));
}
}
答案 0 :(得分:0)
您没有考虑过两个以上数字的序列。如果您有[3,2,1]
,则结果应为6
。但是你的代码会给5
,因为它只查看当前数字和前一个数字的总和,而你应该跟踪当前的下行顺序,并将当前数字添加到该下行序列的运行总数中。一旦您点击了一个数字,如果需要,可以打破后续更新maxsum
,然后将运行总计重置为0
。
不确定为什么你在循环中有其他?如果a[i]
不小于a[i-1]
,那么它不是一个后果,因此肯定maxsum
不应该更新。如果只取样样数组中的前3个数字,则返回数字2
。因为第一个下降序列[5,-11]
会给出-6
的总和,并且在下一次迭代中,它只会查看2
,它大于-6
因此maxsum
}已更新。
无需:
if (a.length==0){
return Integer.MIN_VALUE;
}
如果数组长度为0,那么你永远不会进入循环,因此永远不会改变maxsum,因此它仍然等于Integer.MIN_VALUE,所以无论如何你都可以在最后返回maxsum。
答案 1 :(得分:0)
获取输入{3,2,1}
答案应为6
您的计划5
。
你的方法是正确的,每次你在数组中测试一个数字,你检查它是否小于(实际上这应该是<=
)之前的数组元素。
如果是,则将总和更新为:sum = a[i] + a[i-1];
这是不正确的。程序中的sum
表示当前子序列的运行朗姆酒。你不应该覆盖它。
答案 2 :(得分:0)
动态编程是最佳选择。
我知道,也许这根本没有帮助,但由于我不想为你的问题发布解决方案,我能做的最好的事情就是给你这个提示:)
答案 3 :(得分:0)
我认为你想要一笔运行金额。含义Sum = Sum + A [i]。只需确保将总和初始化为数组的第一个成员即可开始营业。
答案 4 :(得分:0)
package sree;
import java.util.ArrayList;
import java.util.List;
import javax.lang.model.element.NestingKind;
public class MaximumSumSequence {
private final int[] theArray;
private MaximumSumSequence(int[] theArray) {
this.theArray = theArray;
}
private void maximumSequence() {
int currentMax = 0,currentSum = 0, start = 0, end = 0, nextStart = 0;
for (int i=0; i< theArray.length; i++) {
currentSum += theArray[ i ];
if (currentMax < currentSum) {
currentMax = currentSum;
start = nextStart;
nextStart = end;
end = i;
} else if (currentSum < 0) {
currentSum = 0;
}
}
System.out.println("Max Sum :" + currentMax);
System.out.println("Start :" + start);
System.out.println("End :" + end);
}
public static void main(String[] args) {
//int[] anArray = {4, -1, 2, -2, -1, -3};
int[] anArray ={-2, 1, -3, 4, -1, 2, 1, -5, 4};
new MaximumSumSequence(anArray).maximumSequence();
}
}