53. Maximum Subarray
DP思路
- 状态:总和
- dp function: dp[i]=a 表示以i为终点时的最大和
- select: dp[i] = max(dp[i-1]+nums[i], nums[i])
- base case: dp[0]=nums[0]
- optimizaton:这里没有
Code
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// if(!nums.size()) return 0;
// if(nums.size()==1) return nums[0];
vector<int> dp(nums.size()+1, 0);
dp[0]=nums[0];
int maxvalue=nums[0];
for(int i=1; i<nums.size(); i++){
dp[i] = max(dp[i-1]+nums[i], nums[i]);
maxvalue=max(maxvalue, dp[i]);
}
return maxvalue;
}
};
贪心
- 先算当前值,求出连续和,更新最大值
- 当发现加上当前值,导致当前连续和<0时,立刻从下一个开始重新算。
- 因为这说明当前连续和没有贡献,加了也没用,只会拖累后面,赶紧换起点重新开始
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int tmp=0;
int max_v=nums[0];
for(int i=0; i<nums.size(); i++){
tmp+=nums[i];
if(tmp>max_v) max_v=tmp;
if(<0) tmp=0;
}
return max_v;
}
};