53_最大子序和

 

package 数组;
/**
* https://leetcode-cn.com/problems/maximum-subarray/
* @author Huangyujun
* 思路:在某个变量之前的tmp_sum 如果是大于 0的,则之前这部分tmp_sum 要保留下来
* 题意:找到一个具有最大和的连续子数组
*
解释一下:这道题目为什么不使用双指针:假如使用双指针,初始化:left = 0, right = nums.length - 1;
while(left < right): 更新和,这时候应该移动左指针还是右指针呢(题意没给呀)题意没给暗示指针走向,导致指针移动不确定呀
*
*
*
思路:遍历数组sums:
① 如果当前是nums[i] + 原积累的前 i - 1 个元素的和, 比 nums[i] 还 大,(这里也说明了 原积累的前 i - 1 个元素的和 是大于 0 的 )
则选择 积累
否则 从 当前的 nums[i] 开始,重新积累
② 遍历过程不断的更新当前的记录的最大值max_sum
*
*/
public class _53_最大子序和 {
public int maxSubArray(int[] nums) {
int max_sum = nums[0];
int sum = 0;
int tmp_sum = 0;
int len = nums.length;
for(int i = 0; i < len; i++) {
//当前计算得到的最大tmp_sum
tmp_sum = Math.max(tmp_sum + nums[i], nums[i]);
//更新记录中的最大max_sum
// if(max_sum < tmp_sum) {
// max_sum = tmp_sum;
// }
max_sum = Math.max(tmp_sum, max_sum);
}
return max_sum;
}
}

//class Solution {
// public int maxSubArray(int[] nums) {
// int pre = 0, maxAns = nums[0];
// for (int x : nums) {
// pre = Math.max(pre + x, x);
// maxAns = Math.max(maxAns, pre);
// }
// return maxAns;
// }
//}

//[-2,1,-3,4,-1,2,1,-5,4]
//[1,2,-1,-2,2,1,-2,1,4,-5,4]

 


作者:一乐乐​