题目解释:给定一个整数序列,a0, a1, a2, …… , an(项可以为负数),求其中最大的子序列和。如果所有整数都是负数,那么最大子序列和为0;
例如:对于序列-2, 11, -4, 13, -5, –2。 所求的最大子序列和为20(从11到13,即从a1到a3)。
/**
* Created by ShoppingChen on 2017/9/5.
*/
public class MaximumSequence {
private int[] data = new int[]{-2,11,-4,13,-5,-2};
public MaximumSequence(){
Log.d("MaximumSequence",getMaximumSequence()+"");
}
public int getMaximumSequence(){
int result = 0;
int resultMax = result;
int cache = 0;
boolean isHead = true;
for(int i = 0;i<data.length;i++){
if(isHead){
if(data[i]<=0){//过滤掉 第一个 和后边连续较大的 负数
continue;
}else{
//第一次遇到正数,即为临时最大子序列的值
isHead=false;
resultMax = data[i];
result = data[i];
continue;
}
}
if(data[i] >= 0){
result += data[i];
resultMax = (result>resultMax) ? result:resultMax;
}else{
cache = result+data[i];
if(cache < 0){//如果相加值为负数,则直接跳出,重走流程
isHead = true;
result = 0;
continue;
}else {
result = cache;
}
}
}
return resultMax;
}
}
时间复杂度为 O(n);
在网上看到好多,按照自己的想法,做了一下改进,凡事都要自己尝试一下嘛。