目录
题目:
代码(首刷看解析 2024年2月9日):
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = INT_MIN;
int count = 0;
for (int i = 0; i < nums.size(); ++i) {
count += nums[i];
res = max(res,count);
if (count < 0) count = 0;
}
return res;
}
};
代码(二刷看解析 2024年2月29日)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
// dp
if (n == 1) return nums[0];
vector<int> dp(n);
// 左到右
dp[0] = nums[0];
int res = nums[0];
for (int i = 1; i < n; ++i) {
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
res = max(dp[i], res);
}
return res;
}
};
代码(三刷自解 2024年3月3日)
关键是要想得到用DP
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// dp[i]表示前i的最大子数组 todo:dp[0]
vector<int> dp(nums.size(), INT_MIN);
dp[0] = nums[0];
int res = dp[0];
for (int i = 1; i < nums.size(); ++i) {
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
res = max(res, dp[i]);
}
return res;
// 递推公式:dp[i] = max(dp[i - 1] + nums[i], nums[i]);
}
};
代码(四刷看解析 贪心 2024年6月4日 go)
// 子数组是连续
// 贪心的思路: 局部最优解是,每次新加入的值都是正数,以避免拖累总和;如果是负数,就应该立刻舍弃,从新值开始算
func maxSubArray(nums []int) int {
res := nums[0]
tempSum := 0
for i := 0; i < len(nums); i++ {
tempSum += nums[i]
if tempSum > res {
res = tempSum
}
// 若当前tempSum小于0,则会拖累后续的子序列,则直接重置为0
if tempSum < 0 {
tempSum = 0
}
}
return res
}
代码(五刷看解析 贪心 2024年7月26日)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 局部最优:所有数都是正数
int res = nums[0];
int temp = 0;
for (int i = 0; i < nums.size(); i++) {
temp += nums[i];
res = max(temp, res);
if (temp < 0) temp = 0;
}
return res;
}
};
代码(六刷自解 2024年9月18日 动态规划)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size());
// dp[i] = dp[i - 1] + nums[i] dp[i - 1] > 0
dp[0] = nums[0];
int res = nums[0];
for (int i = 1; i < nums.size(); i++) {
if (dp[i - 1] > 0) {
dp[i] = dp[i - 1] + nums[i];
} else {
dp[i] = nums[i];
}
res = max(res, dp[i]);
}
return res;
}
};