题目:输入一个整形数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
思路:
解法一:举例分析数组的规律
public int FindGreatestSumOfSubArray(int[] array) {
if(array == null || array.length <= 0){
return 0;
}
int sum = 0;
int nGreatestSum = 0x80000000;
for(int i=0;i<array.length;i++){
if(sum<=0){
sum = array[i];
}
else{
sum += array[i];
}
if(sum > nGreatestSum){
nGreatestSum = sum;
}
}
return nGreatestSum;
}
其中,0x80000000是-2147483648,int的最小值,0x7fffffff 是int的最大值。
public int FindGreatestSumOfSubArray(int[] array) {
if(array == null || array.length <= 0){
return 0;
}
int sum = array[0], tempsum = array[0]; //注意初始值 不能设为0 防止只有负数
for(int i = 1; i < array.length; i++) //从1开始 因为0的情况在初始化时完成了
{
tempsum = (tempsum < 0) ? array[i] : tempsum + array[i];
sum = (tempsum > sum) ? tempsum : sum;
}
return sum;
}