题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)。
源代码:
解法一:
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
if(array.length==0||array==null)
return 0;
int cursum=0;
int greatestsum=Integer.MIN_VALUE;
for(int i=0;i<array.length;i++){
if(cursum<0){//如果当前元素的和小于0的话,则重新从当前元素开始
cursum=array[i];
}else{//cursum>=0//如果前面元素的和大于0的话,则加上当前元素
cursum += array[i];
}
if(cursum>greatestsum)//如果前面元素的和大于最大元素和的话,则替换
greatestsum = cursum;
}
return greatestsum;
}
}
解法二:
public class Solution {
public int max(int a,int b){
return a>b?a:b;
}
public int FindGreatestSumOfSubArray(int[] array) {
if(array.length==0||array==null)
return 0;
int[] maxsum=new int[1000];
int[] nend=new int[1000];
int len=array.length;
maxsum[0] = nend[0] = array[0];
for(int i=1;i<len;i++){
nend[i] = max(array[i],nend[i-1]+array[i]);//注意这里:表示已第i个元素结尾的最大和,分两种情况:1、单独第i个元素,2、第i个元素加上以第i-1个元素结尾的最大和,不能是前面第i-1个元素的最大值加上第i各元素,因为可能不是最大连续子序列
maxsum[i] = max(nend[i], maxsum[i-1]);//然后在以第i个元素结尾的最大元素和前i-1个元素的最大值中取最大值
}
return maxsum[len-1];
}
}