题目要求:
数组{-2,3,-1,1,-9,3,10,2,-6,7,8},求其长度最大子序列。
求解代码:
int a[]= {-2,3,-1,1,-9,3,10,2,-6,7,8};
int box1=0,box2=0,max=a[0];//box1是选择放入,box2选择不放入
int start=0;/start=0表示开始新的子序列
for(int i=0;i<a.length;i++) {
if(start==0) {
box1=box2=a[i];
start=1;
}else {
box2=box1;
box1=box1+a[i];
}
if(box2>max) {
max=box2;
}
if(box1<0) {
start=0;
}
if(i==a.length-1&&box1>max) {
max=box1;
}
}
System.out.println(max);
思路详解:
我们的解决步骤:
max初始值为a数组的第一个元素,防止数组全为负数时,max无法被赋值。(若为0,无法寻找到数组元素全为负数的最大连续子序列)
1.判断是否是新开始寻找子序列
- 是:使box1和box2的值等于此时循环到的a数组元素。
- 不是:开始判断是否放入数。
2. 每遇到一个数,分为放入和不放入的情况。
- 放入:与前一个box1的值相加,放入box1盒子。
- 不放入:此时步放入数字,使box2的值等于前一个box1的值。因为不放入数字,相当于当前子序列结束,所以此时与max值判断,当box2>max,更新max值为box2。
3. 比较此时box1的值与0,如果box1的值小于0,则当前子序列强制结束,下次循坏寻找新的子序列。因为此时的值已经为-2了,没有-2肯定能得到更大的连续子序列。
4.当循环结束,因为最后一次的box1的值未来得及赋值给box2,所以将box1与max比较,若box1>max,更新max。