当前位置: 代码迷 >> 综合 >> Lintcode 41. 最大子数组
  详细解决方案

Lintcode 41. 最大子数组

热度:57   发布时间:2023-12-25 20:07:24.0

描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。

 

个人思路:通过观察可以知道,要想和最大,那么这个子数组的开头元素和结尾元素必须是个非负数,因此采取的贪心策略是,先索引到数组的第一个非负数,然后开始累加,当累加的索引指向另外一个非负数时,就比较之前的和加上该数大,还是该数本来就大,然后再对前一步的结果和之前记录的最大两者取最大

(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 hereint 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 不同,那题求的是个数最多,这题求的是累积和最多