53_最大子序和

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]

 

posted @ 2021-12-19 22:12  一乐乐  阅读(31)  评论(0编辑  收藏  举报