[英]Sum of the maximum downsequence number in an array
给定这个数组
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));
}
}
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();
}
}
您没有考虑超过两个数字的序列。 如果您有[3,2,1]
则结果应为6
。 但是您的代码将给出5
,因为它只查看当前数字和前一个数字的和,而您应该跟踪当前的向下序列并将当前数字添加到该向下序列的运行总数中。 一旦击中一个数字(如果需要),该数字将打破降序更新maxsum
则将运行总计重置为0
。
不知道为什么要在循环中使用else? 如果a[i]
不小于a[i-1]
则它不是降序序列,因此肯定不应该更新maxsum
。 如果仅取样本数组中的前三个数字,它将返回数字2
。 因为第一个下序[5,-11]
的总和为-6
,在下一次迭代时,它只看2
,它大于-6
,因此maxsum
被更新。
无需:
if (a.length==0){ return Integer.MIN_VALUE; }
如果数组长度为0,则您永远不会进入循环,因此也不会更改maxsum,因此它仍将等于Integer.MIN_VALUE,因此无论如何都可以在最后返回maxsum。
接受输入{3,2,1}
,答案应该是6
您的程序给出5
。
您的方法是正确的,每次在数组中测试一个数字时,都要检查它是否小于(实际上应该是<=
)先前的数组元素。
如果是,则将sum更新为: sum = a[i] + a[i-1];
这是不正确的。 程序中的sum
表示当前子序列的运行朗姆酒。 您不应该覆盖它。
动态编程是必经之路。
我知道,也许这根本没有帮助,但是由于我不想为您的问题发布解决方案,所以我能做的最好的事情就是给您这个提示:)
我想你应该算一笔账。 含义Sum = Sum + A [i]。 只要确保将总和初始化为数组的第一个成员就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.