leetcode-53

date
slug
leetcode-53
status
Published
tags
Leetcode
summary
type
Post

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

思路

这是一道动态规划题目,按照一般步骤,我们需要定义 dp[i] 的意义
在这题中 dp[i] 被定义为 以nums[i]结尾的最大子序和
那么按照数学归纳法,假设我们已知 dp[i-1] 如何求 dp[i]
稍加分析,我们会发现,dp[i] 的值只有两种情况
dp[i] = dp[i-1] + nums[i]

OR

dp[i] = nums[i]
那么写出状态转移方程 dp[i] = max{dp[i-1] + nums[i], nums[i]}
最终答案就是 dp[0…i] 中最大的一个值
我们利用遍历得出即可

题解

class Solution {    public int maxSubArray(int[] nums) {        int length = nums.length;        int[] dp = new int[length];        dp[0] = nums[0];        for (int i=1; i<length; i++) {            dp[i] = Math.max(nums[i], dp[i-1] + nums[i]);        }        int result = Integer.MIN_VALUE;        for (int i=0; i<length; i++) {            result = Math.max(result, dp[i]);        }        return result;    }}

总结

这是一题比较特别的动态规划,与其他题目对 dp[i] 的定义有所不同
但只需实际分析 dp[i] 会出现的两种结果,即可得出答案

© AlotOfBlahaj 2022 - 2025