1. Problem Description of 53.Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.
求一個數組的最大連續和
2. My solution
這類問題需要關注的核心問題是:
局部最優解如何求得,和全局最優解的關係(狀態轉移方程的確定)
該題的狀態轉移方程,僅考慮兩個值得大小:Local[i-1]+nums[i]和nums[i]
因此:Local[i]=max([i-1]+nums[i],nums[i])
int maxSubArray(vector<int>& nums)
{
vector<int>local;
int len=nums.size();
//range of int:-(1<<31)~(1<<31)-1
if(len==1)
return nums[0];
local.push_back(nums[0]);
int global=local[0];
for(int i=1; i<len; i++)
{
local.push_back(max(local[i-1]+nums[i],nums[i]));
global=max(global,local[i]);
}
return global;
}
3. Problem Description of 152. Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.
求數組中元素的最大連續積。
4. My solution
題目與最大連續和的區別關鍵在於我們不能只考慮前一個最大數與當前數的和。
因爲負數的存在,很可能一個絕對值較大的負數,和一個負數相乘得到一個很大的證書。
所以除了記錄局部最大值,我們還應該記錄局部最小值。
因爲nums[i]的正負未知,我們直接把前一個局部最大值和局部最小值分別與nums[i]相乘。
得到:
int tmin=minlocal[i-1]*nums[i];
int tmax=maxlocal[i-1]*nums[i];
最後當前的局部最大值和局部最小值,通過比較三個數得到:
Tmin,tmax,nums[i]
然後更新global值就可以啦~
int maxProduct(vector<int>& nums)
{
int len=nums.size();
if(len==1)
return nums[0];
vector<int>minlocal;
vector<int>maxlocal;
minlocal.push_back(nums[0]);
maxlocal.push_back(nums[0]);
int global=nums[0];
for(int i=1; i<len; i++)
{
int tmin=minlocal[i-1]*nums[i];
int tmax=maxlocal[i-1]*nums[i];
minlocal.push_back(min(min(tmin,tmax),nums[i]));
maxlocal.push_back(max(max(tmin,tmax),nums[i]));
global=max(maxlocal[i],global);
}
return global;
}