简介
题目链接:https://leetcode.cn/problems/maximum-subarray/description/
解决方式:数组 + 动态规划
这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!
推荐查看liweiwei1419大佬所作题解。
动态规划
解题思路:动态规划解题有三个部分:状态定义、状态转移方程式、初始值与边界。至于如何进行状态的定义,需要每一位读者去感悟、发现,因为题目的要求是不一样的,没有固定的模版。
非空间最优
java
class Solution {
public int maxSubArray(int[] nums) {
int len = nums.length;
// 状态定义(子问题/小问题)
// 以当前元素为结尾的所有连续数组的最大值
// 此定义下的连续数组只有两个,分别是前面所有元素加上当前元素(q)以及仅包含当前元素(w)
int[] dp = new int[len];
// 初始值与边界
dp[0] = nums[0];
// 最大值
int max = nums[0];
// 状态转移方程
// 从小到大,从下到上的计算
for(int i = 1; i < len; i++){
if(dp[i-1] > 0){
// 前面元素和大于 0,那么当前这个 q 数组最大值就是前面元素和 + 当前元素
dp[i] = dp[i-1] + nums[i];
}else{
// 否则,连续数组最大值就是 w 数组
dp[i] = nums[i];
}
// 比对当前连续数组是否是最大值
max = Math.max(max, dp[i]);
}
// 返回数据
return max;
}
}
空间优化
值得注意的是,空间优化后的可读性十分不好。
java
class Solution {
public int maxSubArray(int[] nums) {
// 状态的定义
// 当前元素为结尾的连续数组的最大值
int dp = 0;
// 最大的值
int max = nums[0];
// 迭代
for(int num : nums){
// 状态转移方程式
dp = Math.max(dp + num, num);
// 获取连续数组的最大值
max = Math.max(dp, max);
}
// 返回最大值
return max;
}
}