Given an integer array nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.
思路:可以考虑利用单调性解题,因为从i到i这段假如是最大值的话,那么i到j-1的和一定是大于0的。因为如果小于0,那么这一段就没必要取,所以设置两个指针,cur记录当前段的和,Max记录最大值,当cur<0时,考虑cur=0,因为这不会对答案有恭献。
代码:
#include <bits/stdc++.h>
#define inf 1e18
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
int cur=0,Max=-inf;
for(auto &t: nums)
{
cur+=t;
Max=max(cur,Max);
if(cur<0)
{
cur=0;
}
}
return Max;
}
};
思路2:动态规划求解
dp[i]表示以i结尾的最大值,那么dp[i]=max(dp[i-1]+num[i],num[i]),因为最后一个要么与前面想连,要么不相连。
代码:
#include <bits/stdc++.h>
#define inf 1e18
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
int n=nums.size();
int Max;
int dp[n+10];
dp[0]=nums[0];
Max=dp[0];
for(int i=1;i<n;i++)
{
dp[i]=max(dp[i-1]+nums[i],nums[i]);
if(Max<dp[i])
{
Max=dp[i];
}
}
return Max;
}
};
思路3:分治,因为最值要么在左边,要么在右边,要么横跨两边,所以分治求解即可。
代码:
#include <bits/stdc++.h>
#define inf 1e18
using namespace std;
class Solution {
int getCrossSum(vector<int> &nums,int low,int high)
{
if(low >=high)
return nums[low];
int mid = low+high;
mid =mid/2;
int sum = nums[mid];
int tsum=sum;
for(int i = mid-1;i>=low;i--)
{
tsum+=nums[i];
if(sum<tsum)
sum=tsum;
}
tsum=sum;
for(int i = mid+1; i<=high; i++)
{
tsum+=nums[i];
if(sum<tsum)
sum=tsum;
}
return sum;
}
int maxSum(vector<int> &nums,int low, int high) {
if(low>=high)
return nums[low];
int mid = low+high;
mid = mid/2;
int crossSum = getCrossSum(nums,low,high);
int leftSum = maxSum(nums,low,mid);
int rightSum = maxSum(nums,mid+1,high);
if(leftSum> rightSum && leftSum> crossSum)
return leftSum;
if(rightSum> crossSum)
return rightSum;
return crossSum;
}
public:
// int maxSubArray(vector<int>& nums)
// {
// int n=nums.size();
// int Max;
// int dp[n+10];
// dp[0]=nums[0];
// Max=dp[0];
// for(int i=1;i<n;i++)
// {
// dp[i]=max(dp[i-1]+nums[i],nums[i]);
// if(Max<dp[i])
// {
// Max=dp[i];
// }
// }
// return Max;
// }
int maxSubArray(vector<int> &nums)
{
return maxSum(nums,0,nums.size()-1);
}
};