Given an integer array nums
, find the
subarray
with the largest sum, and return its sum.
Example 1:
Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: The subarray [4,-1,2,1] has the largest sum 6.
Example 2:
Input: nums = [1] Output: 1 Explanation: The subarray [1] has the largest sum 1.
Example 3:
Input: nums = [5,4,-1,7,8] Output: 23 Explanation: The subarray [5,4,-1,7,8] has the largest sum 23.
这个题用DP和贪心都可以做
DP解法:
设dp[i]为,截至到i,能找的的最大子序列和。
我们可以想象,dp[i]的数据来源只有两个,第一:dp[i-1]+nums[i]。也就是前一位能找到的最大子序列和加上当前的第i个元素。第二:nums[i]。如果dp[i-1]<0,那么我们应该只选择目前遍历的这个元素。
所以dp的状态转移公式就是
dp[i]=max(dp[i-1]+nums[i],nums[i])
完整代码如下
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size(),0);
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];
}
}
return result;
}