problem description:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大为 6。
1暴力法(事实证明暴力魔法不可取啊(手动狗头))
又一次超时了
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()==0) return 0;
int max =nums[0];
int temp =0;
for(int i=0;i<nums.size();i++)
for(int j=i;j<nums.size();j++)
{
temp=sum(nums,i,j);
if(temp>max)
max=temp;
}
return max;
}
int sum(vector<int>& nums,int i,int j)
{
int sum =0;
for(int k=i;k<=j;k++)
sum =sum+nums[k];
return sum;
}
};
显然,这是一个可以用动态规划来解决的优化问题,既然要用动态规划来做的话,我们就要考虑如何划分子问题,如果以Maxsubarray(nums,i,j),即i到j的最大子序和的话,这样的很难发现各个子问题之间的联系,如果我们将i固定在一端的话,即创造一个Maxsubarray(nums,i),即求在0到i之间的最大子序列:
maxsubArray(A,i)=maxsubArray(A,i-1)>0?maxsubArray(A,i-1)+A[i];
代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
int *dp =new int [n];
dp[0]=nums[0];
int max=nums[0];
for(int i=1;i<n;i++)
{
dp[i]=nums[i]+((dp[i-1]>0)?dp[i-1]:0);
max=Max(max,dp[i]);
}
return max;
}
int Max(int a,int b)
{
if(a>b) return a;
return b;
}
};