[LintCode]191.乘积最大子序
2017-10-01 00:11
246 查看
找出一个序列中乘积最大的连续子序列(至少包含一个数)。
样例
比如, 序列
思路:动态规划,每一步只需要记住其前一步的整数最大值和负数的最小值。因为涉及到正负,所以要保存最小值和最大值两种情况,因为负负得正。最小值的比较包括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;
}
};
样例
比如, 序列
[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;
}
};
相关文章推荐
- 乘积最大子序列,lintcode
- Lintcode 乘积最大子序列
- 最大子序乘积问题的分析
- LintCode:乘积最大子序列
- lintcode--乘积最大子序列
- LintCode-乘积最大子序列
- lintcode乘积最大子序列(动态规划)
- lintcode--乘积最大子序列
- LintCode -- 乘积最大子序列
- lintcode刷题——乘积最大子序列
- [Lintcode]Maximum Product Subarray乘积最大子序列
- 乘积最大子序列-LintCode
- FZU_1208_最大k乘积问题
- 《算法入门经典》-最大乘积(java实现)
- 最大连续子序和 (加强版?)
- 最大上升子序和
- 程序员编程艺术第二十八~二十九章:最大连续乘积子串、字符串编辑距离
- 求解连续子数组乘积的最大值
- [经典面试题]子数组的最大乘积
- Openjudge 8782 乘积最大