描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
个人思路:通过观察可以知道,要想和最大,那么这个子数组的开头元素和结尾元素必须是个非负数,因此采取的贪心策略是,先索引到数组的第一个非负数,然后开始累加,当累加的索引指向另外一个非负数时,就比较之前的和加上该数大,还是该数本来就大,然后再对前一步的结果和之前记录的最大两者取最大
(PS:请忽视我混乱的代码)
public int maxSubArray(int[] nums) {
int start = 0;
int sum2 = nums[start];
while(start < nums.length && nums[start] < 0) {
if(sum2 <= nums[start])
sum2 = nums[start];
start++;
}
if (start == nums.length)
return sum2;
int maxSum = nums[start];
int sum = maxSum;
for (int i = start+1; i < nums.length; i++) {
if (nums[i] >= 0){
maxSum = (maxSum + nums[i] > nums[i]) ? (maxSum + nums[i]) : nums[i];
sum = Integer.max(maxSum, sum);
}else{
maxSum += nums[i];
}
}
return sum;
}
dalao思路:采取的贪心策略是不管怎样,先把遍历到的数加起来,如果目前的结果和为负,那前面累加的数就没有意义,将变量置为0,重新开始累加。即贪心策略为不符合的,直接丢掉
// write your code here
int i;
int elemSum = 0; //数组元素逐个求和
int maxSum = nums[0]; //记录连续求和最大值(初始值)
for (i = 0; i < nums.length; i++) {
elemSum += nums[i];
//顺序累加求和,记录最大值
if (elemSum > maxSum && elemSum > 0) { //初始值为负时,elemSum大于0判定
maxSum = elemSum;
}
//和为零时,从下一个元素重新累加
if (elemSum < 0) {
elemSum = 0;
}
}
return maxSum;
summary:与AssignCookie1230 不同,那题求的是个数最多,这题求的是累积和最多