力扣:53. 最大子数组和

87 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

描述

给你一个整数数组 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) 的解法,尝试使用更为精妙的 分治法 求解。

解析

这道题看了下官网的解决方案,第一种是给了动态规划的方式,第二种是分治,这里就只说一下对动态规划方案的理解,后续再尝试使用分治来解决。

根据动态规划的思路,可以把状态定义、状态转移方程、初始化、输出、空间优化都列举出来进行解析。

主要分为以下几个步骤:

  1. 首先遍历数组,设置两个变量值,最大连续子序列和为 sum和结果result
  2. 如果sum>0,表示sum符合我们的要求,能够使结果增大,就可以保留该值并加上当前遍历的值
  3. 如果 sum <= 0,表示sum符合我们的要求,直接舍弃,sum更改为当前遍历的值
  4. 比较sum和result的值大小,取最大值设置为result
  5. 遍历完成,返回result
class Solution {
    public int maxSubArray(int[] nums) {
        int result = nums[0];
        int sum = 0;
        for(int num: nums) {
            if(sum > 0) {
                sum += num;
            } else {
                sum = num;
            }
            result = Math.max(result, sum);
        }
        return result;
    }
}

复杂度:

  • 时间复杂度:O(n),n表示数组的长度
  • 空间复杂度:O(1)。只需要常数空间存放若干变量

运行结果:

执行结果:通过

执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:50.4 MB, 在所有 Java 提交中击败了79.45%的用户