您的位置:首页 > 其它

leetCode刷题归纳-Dynamic Programming(53. Maximum Subarray&& 152. Maximum Product Subarray)

2017-06-10 13:54 471 查看

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.

解题思路

求一个array里面的的最大加权的连续字串,动态规划的思想,设置一维动态数组即可,假设扫描到索引为i的数字时候状态为dp[i],那么前一个状态dp[i-1]就存在两种情况:>0 或者<=0 我采取的办法是,如果小于等于0那么就抛弃之前的状态—将dp[i-1]重置为0,这样在O(n)的时间复杂度内可以得到最大的dp值,也就是我们需要求出的最大加权字串值

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
int* dp=new int
;
dp[0]=nums[0];
int res=dp[0];
for(int i=1;i<n;i++){
dp[i]=nums[i]+(dp[i-1]>0?dp[i-1]:0);
res=max(dp[i],res);
}
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.

解题思路

跟上面一题很类似,只是计算dp值的规则不同,改成了乘积而已,这里我们需要注意的是,乘积不像求加法,两个负数相乘可能得到很大的正数,所以这里我们需要对乘法进行多种情况考虑(正数x正数,负数x负数,正数x负数),解题方法如下:

class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.empty()) return 0;
//从第一个数字开始处理
int res=nums[0];
int preMax=res,preMin=res;

for(int i=1;i<nums.size();i++){
if(nums[i]<0) swap(preMax,preMin);//如果当前处理的数字小于0,那么比较大的数字乘后反而小。。
preMax=max(nums[i],preMax*nums[i]);
preMin=min(nums[i],preMin*nums[i]);

res=max(res,preMax);
}
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: