【DP】【分治】LeetCode 53. 最大子数组和

发布时间 2023-04-14 09:16:05作者: Frodo1124

题目链接

[https://leetcode.cn/problems/maximum-subarray/description/](53. 最大子数组和 "https://leetcode.cn/problems/maximum-subarray/description/")

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

表示状态

我们用 dp[i] 表示加到第 i 个数的累加和

找状态转移方程

边界处理

很容易知道 \(dp[0] = nums[0]\),并且 \(result = nums[0]\)

空间优化

因为 \(dp[i]\) 只和 \(dp[i-1]\) 有关,所以可以不断更新维护单变量 sum 求出最终结果。

代码

dp数组版

class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        int result = nums[0];

        dp[0] = nums[0];
        for(int i = 1; i < nums.length; i++){
            if(dp[i - 1] < 0){
                dp[i] = nums[i];
            }else{
                dp[i] = nums[i] + dp[i - 1];
            }

            result = Math.max(result, dp[i]);
        }

        return result;
    }
}

空间优化版

class Solution {
    public int maxSubArray(int[] nums) {
        int result = nums[0];
        int sum = nums[0];

        for(int i = 1; i < nums.length; i++){
            if(sum < 0){
                sum = nums[i];
            }else{
                sum = nums[i] + sum;
            }

            result = Math.max(result, sum);
        }

        return result;
    }
}