Maximum Subarray 和 Maximum Product Subarray
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.
解答
动态规划解法。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.empty()) return 0;
int res = nums[0];
int maxCurPre = nums[0];
for(int i = 1; i < nums.size(); ++i)
{
maxCurPre = max(maxCurPre+nums[i],nums[i]);
res = max(res,maxCurPre);
}
return res;
}
};
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
解答
动态规划解法。
对于当前的每一个下标对应的元素,我们维护这个元素及其之前的所有元素的一个连续子数组的最大值,和一个连续子数组的最小值。
因为对于下一个结点,如果是负数,有可能使得原来的最小值,变为较大值,原来的最大值变为较小值。
状态转移方程为:
maxCurPre = max( max( maxCurPre * nums[i], minCurPre * nums[i] ),nums[i] );
minCurPre = min( min( maxCurPre * nums[i], minCurPre * nums[i] ),nums[i] );
注意两个等式右边所用的maxCurPre,minCurPre均是上次状态的值,而不是新的状态值。
对于当前的最大值应该为
res = max(res,maxCurPre);
class Solution {
public:
int maxProduct(vector<int>& nums) {
int maxCurPre = nums[0];
int minCurPre = nums[0];
int res = nums[0];
int maxCurPreToNew,minCurPreToNew;
for(int i = 1; i < nums.size(); ++i)
{
maxCurPreToNew = maxCurPre * nums[i];
minCurPreToNew = minCurPre * nums[i];
maxCurPre = max(max(maxCurPreToNew,minCurPreToNew),nums[i]);
minCurPre = min(min(maxCurPreToNew,minCurPreToNew),nums[i]);
res = max(res,maxCurPre);
//maxCurPre = max( max( maxCurPre * nums[i], minCurPre * nums[i] ),nums[i] );
//minCurPre = min( min( temp * nums[i], minCurPre * nums[i] ),nums[i] );
}
return res;
}
};