給定一個整數數組 nums
,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
進階:
如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
在本題中,我想到的兩種方法,一種是普通的枚舉法,時間複雜度爲o(n^2),還有一種是動態規劃,時間複雜度爲o(n);具體的過程如下:
(1)枚舉法:將數組的每一個數依次作爲sum求和的第一個數,依次往後求和,同時存儲最大的數值,用了兩個for循環,但是在允許時間範圍之內,直接AC;代碼如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int count=nums.size();
if(count<1) return NULL;
int max=nums[0];int st=0;int sum=0;
for(int i=0;i<count;i++)
{
st=nums[i];
sum=0;
for(int j=i;j<count;j++)
{
sum+=nums[j];
if(sum>max)
{
max=sum;
}
}
}
return max;
}
};
(2)第二種是動態規劃法:設sum[i]爲以第i個元素結尾且和最大的連續子數組。即sum[i] = max(sum[i-1] + a[i], a[i])。可以通過判斷sum[i-1] + a[i]是否大於a[i]來做選擇,而這實際上等價於判斷sum[i-1]是否大於0。代碼如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
if(n<1) return NULL;
int sum=0;int max=nums[0];
for(int i=0;i<n;i++)
{
//sum=sum+nums[i];
if(sum>=0)
{
sum+=nums[i];
}
else{
sum=nums[i];
}
if(sum>max)
max=sum;
}
return max;
}
};