当前位置:网站首页>2022.08.06_每日一题

2022.08.06_每日一题

2022-08-09 18:00:00 诺.い

53. 最大子数组和

题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

 

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

 

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

 

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

coding

用 pre 记录局部最优值,用 max 记录全局最优值。
每遍历一个新元素时,判断(已遍历的连续子数组的和)加上(当前元素值),与(当前元素值)对比谁更大。

(1)如果已遍历的连续子数组的和 + 当前元素值 >= 当前元素值

说明(已遍历的连续子数组的和)是大于等于0的,令 pre= 已遍历的连续子数组的和 + 当前元素值。

(2)如果已遍历的连续子数组的和 + 当前元素值 < 当前元素值

说明(已遍历的连续子数组的和)是小于0的,加上这部分只会使子数组和变得更小,故可直接抛弃掉这部分,令  pre = 当前元素值。

(3)对比 pre 和 max,如果 pre 更大,则更新到 max 中。
class Solution {
    
    public int maxSubArray(int[] nums) {
    
        int pre = 0;
        int max = nums[0];
        for (int i = 0; i < nums.length; i ++) {
    
            pre = Math.max(pre + nums[i], nums[i]);
            max = Math.max(pre, max);
        }
        return max;
    }
}

原网站

版权声明
本文为[诺.い]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_60717329/article/details/126192290