53. 最大子数组和
一、贪心
使用count进行计数,每次与下一元素求和后判断是否大于result,若大于(即出现更大的子数组),记录result
判断count是否小于0,若小于0(即前面的子数组会对后面的数组产生负面的影响)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT_MIN;
int count = 0;
for(int i =0;i<nums.size();i++)
{
count += nums[i];
if(count>result)
result = count;
if(count<=0)count=0;
}
return result;
}
};
二、动态规划
- 状态定义: dp[i]以i元素结尾的最大连续子数组和
- 状态转移方程:dp[i] = max(dp[i - 1] + nums[i], nums[i]);
```cpp class Solution { public: int maxSubArray(vector& nums) {
} };if (nums.size() == 0) return 0;
vector<int> dp(nums.size(), 0); // dp[i]表示包括i之前的最大连续子序列和
dp[0] = nums[0];
int result = dp[0];
for (int i = 1; i < nums.size(); i++) {
dp[i] = max(dp[i - 1] + nums[i], nums[i]); // 状态转移公式
if (dp[i] > result) result = dp[i]; // result 保存dp[i]的最大值
}
return result;
class Solution {
public:
int maxSubArray(vector