寫在前面
- 數據結構預算法思想之動態規劃
- 解決多階段決策過程 最優化問題 的一種常用方法。兩個重要性質:
- 有了思想鑰匙,必定打開問題之門!!!
題目詳情
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
進階:
如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
ac代碼
- 核心思想(動態規劃)
- 掃描法—O(N)
- 加1個正數,和增加;
- 加1個負數時,和減少。
- 如果當前和是負數,那麼這個和在接下來累加中應該拋棄並置零,不然負數將會減少接下來的和,影響局部最優子結構。
- 針對數組全爲負數情況,相當於求解所有元素中最大的負數值
class Solution
{
public:
int maxSubArray(vector<int>& nums)
{
int sum = nums[0], maxs = nums[0];
for(int i=1; i<nums.size(); i++)
{
if(sum > 0)
sum += nums[i];
else
sum = nums[i];
if(sum > maxs)
maxs = sum;
}
return maxs;
}
};
#include<iostream>
#include<vector>
using namespace std;
int maxSubArray(vector<int>& nums)
{
int sum = nums[0], maxs = nums[0];
for(int i=1; i<nums.size(); i++)
{
if(sum > 0)
sum += nums[i];
else
sum = nums[i];
if(sum > maxs)
maxs = sum;
}
return maxs;
}
int main()
{
vector<int> nums =
{
-2,-1,-3,-4,-1,-2,-1,-5,-4
};
cout << maxSubArray(nums) << endl;
return 0;
}