題目描述
輸入一個(gè)整型數(shù)組讹蘑,數(shù)組中的一個(gè)或連續(xù)多個(gè)整數(shù)組成一個(gè)子數(shù)組。求所有子數(shù)組的和的最大值筑舅。
要求時(shí)間復(fù)雜度為O(n)座慰。
示例1:
輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續(xù)子數(shù)組 [4,-1,2,1] 的和最大,為 6翠拣。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
解題思路
- 動(dòng)態(tài)規(guī)劃
記dp[i]為以數(shù)組第i個(gè)數(shù)結(jié)尾的最大子數(shù)組和版仔,那么有:
dp[i]=max(dp[i-1],0)+nums[i]
找到最大的dp[i],即為所求的連續(xù)子數(shù)組的最大和误墓。 - 優(yōu)化
dp[i]只與前一項(xiàng)優(yōu)化蛮粮,因此只需一個(gè)變量存儲(chǔ)值即可,不需額外的數(shù)組空間存儲(chǔ)谜慌。
源碼
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
int ans=nums[0];
/*
vector<int> dp(n);
dp[0]=nums[0];
for(int i=1;i<n;i++)
{
dp[i]=max(dp[i-1]+nums[i],nums[i]);
ans=max(dp[i],ans);
}
return ans;
*/
int pre=nums[0];
for(int i=1;i<n;i++)
{
pre=max(pre,0)+nums[i];
ans=max(ans,pre);
}
return ans;
}
};
題目來源
來源:力扣(LeetCode)