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]