您的位置:首页 > 其它

[LintCode]191.乘积最大子序

2017-10-01 00:11 246 查看
找出一个序列中乘积最大的连续子序列(至少包含一个数)。

样例

比如, 序列 
[2,3,-2,4]
 中乘积最大的子序列为 
[2,3]
 ,其乘积为
6


思路:动态规划,每一步只需要记住其前一步的整数最大值和负数的最小值。因为涉及到正负,所以要保存最小值和最大值两种情况,因为负负得正。最小值的比较包括nums[i]、minnums[i]
、maxnums[i],最大值与此相同,其实最大值就是正数,最小值是负数,中间值没必要记录。

class Solution {
public:
/*
* @param nums: An array of integers
* @return: An integer
*/
int maxProduct(vector<int> &nums) {
int posMax = nums[0]; //正数最大
int negMax = nums[0]; //负数最大
int ret = nums[0]; //最大
for(int i=1;i<nums.size();i++)

4000
{
int tempPosMax = posMax;
int tempNegMax = negMax;
posMax = max(nums[i],max(nums[i]*tempPosMax,nums[i]*tempNegMax));
negMax = min(nums[i],min(nums[i]*tempPosMax,nums[i]*tempNegMax));
ret = max(ret,posMax);
}
return ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: