寫在前面:
題目描述:
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
標準解法:
1,定關係:自變量爲x,f(x)是以x爲結尾的數組中的最大子序和;f(x) = max(f(x - 1), nums[x])
2,表格優化代碼:結果即爲數組f中的最大值
---》再優化,其實我們只需要f中的前一個元素,來做比較就好
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
//類似尋找最大最小值的題目,初始值一定要定義成理論上的最小最大值
int result = INT_MIN;
int numsSize = int(nums.size());
//dp[i]表示nums中以nums[i]結尾的最大子序和
vector<int> dp(numsSize);
dp[0] = nums[0];
result = dp[0];
for (int i = 1; i < numsSize; i++)
{
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
result = max(result, dp[i]);
}
return result;
}
};
再次優化:以int dp 代替 數組dp
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
//類似尋找最大最小值的題目,初始值一定要定義成理論上的最小最大值
int result = INT_MIN;
int numsSize = int(nums.size());
//因爲只需要知道dp的前一項,我們用int代替一維數組
int dp(nums[0]);
result = dp;
for (int i = 1; i < numsSize; i++)
{
dp = max(dp + nums[i], nums[i]);
result = max(result, dp);
}
return result;
}
};