【Leetcode】53. Maximum Subarray

253 阅读1分钟

题目地址:

leetcode.com/problems/ma…

题目大意是给定一个int数组,求和最大的非空子串的那个和是多少。 用一个一维数组 dp [ i ] 表示以下标 i 结尾的子数组的元素的最大的和,也就是这个子数组最后一个元素是下边为 i 的元素,并且这个子数组是所有以 i 结尾的子数组中,和最大的。

这样的话就有两种情况,

  • 如果 dp [ i - 1 ] < 0,那么 dp [ i ] = nums [ i ]。
  • 如果 dp [ i - 1 ] >= 0,那么 dp [ i ] = dp [ i - 1 ] + nums [ i ]。
class Solution {
   public int maxSubArray(int[] nums) {
    int n = nums.length;
    int[] dp = new int[n];
    int max = nums[0];
    dp[0] = nums[0];
    for (int i = 1; i < n; i++) {
        //两种情况更新 dp[i]
        if (dp[i - 1] < 0) {
            dp[i] = nums[i];
        } else {
            dp[i] = dp[i - 1] + nums[i];
        }
        //更新 max
        max = Math.max(max, dp[i]);
    }
    return max;
}

}

时间复杂度: O(n)。

空间复杂度:O(n)。

相关链接: 1.53. Maximum Subarray · leetcode

2.(27条消息) 【Leetcode】53. Maximum Subarray_记录算法的博客-CSDN博客