Leetcode-053-子序列最大和

Leetcode-053-Maximum Subarray

思路:动态规划

题目描述

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

示例:

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

Solution:

  • 状态定义
    • dp[i]表示以元素nums[i] 为结尾的连续自数组最大和。
    • 为何定义最大和 dp[i] 中必须包含元素 nums[i] :保证 dp[i] 递推到 dp[i+1]的正确性;如果不包含 nums[i] ,递推时则不满足题目的 连续子数组 要求。
  • 转移方程

    • 如果 dp[i-1]<=0 说明 dp[i-1] 对结果产生了负的贡献,也就是 dp[i-1]+nums[i] 还不如nums[i] 本身大

    • 当dp[i−1]>0 时:
      执行 dp[i] = dp[i-1] + nums[i]
      当 dp[i−1]≤0 时:
      执行 dp[i] = nums[i]
      
      1
      2
      3
      4



      - **初始状态**
      dp[0]=nums[0],即以nums[0]结尾的连续子数组最大和为 nums[0]。
      1
      2
      3
      4



      - **返回值**
      返回dp列表的最大值
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37



      ![mark](http://zhuuu-bucket.oss-cn-beijing.aliyuncs.com/img/20200515/092822711.png)



      **空间复杂度降低:**

      - 上述我们使用了一个dp数组,但是因为 dp[i] 只和 dp[i-1] 和 nums[i] 有关系,因此可以直接将原数组nums用作dp列表,直接在nums上修改即可。

      - 由于省去 d*p* 列表使用的额外空间,因此空间复杂度从O*(*N*) 降至 O*(1) 。



      ## Java

      **Solution :**

      ```java
      class Solution{
      public int maxSubArray(int[] nums){
      // 因为直接修改nums数组
      // 所以结果res初始化为nums[0]
      int res = nums[0];

      // 对数组进行遍历
      for(int i = 1; i < nums.length; i++) {
      // dp[i] = dp[i - 1] + nums[i]
      // dp[i] = nums[i] + 0
      nums[i] += Math.max(nums[i - 1], 0);

      res = Math.max(res, nums[i]);
      }
      return res;
      }
      }

测试用例:

1
2
3
4
5
public static void main(String[] args) {
int[] nums = {-2,3,-1,1,-3};
Solution solution = new Solution();
System.out.println(solution.maxSubArray(nums));
}
  • 时间复杂度 : O(n) 遍历一遍数组
  • 空间复杂度: O(1) 没有使用额外的空间
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信