题目:
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
思路:
需要保存临时最大值和最小值,因为最大值乘以一个正数可能构成新的最大值,而最小值乘以 负数也可能构成新的最大值。result是要求的结果,maxValue为nums[i]之前的,和nums[i]相邻的乘 积的最大值,minValue为nums[i]之前的,和nums[i]相邻的乘积的最小值。首先令result、 maxValue和minValue都为nums[0], i从nums[1]开始一直到结束,tempMax为考虑是否选择之前的 maxValue与nums[i]相乘,如果相乘结果更大就保留,否则就选择nums[i]本身为⼤大。tempMin同理,然后maxValue和minValue比较tempMax*tempMin与minValue * nums[i]的⼤大⼩小关系, maxValue取最大值,minValue取最小值,而esult是取所有maxValue中的最大值。后返回result
代码:
class Solution {
public:
int maxProduct(vector<int>& nums) {
if (nums.size() == 0)
return 0;
int min_value = nums[0], max_value = nums[0], result= nums[0];
for (int i = 1; i < nums.size(); i++)
{
int tempMax = max(nums[i], max_value*nums[i]);
int tempMin = min(nums[i], max_value*nums[i]);
max_value = max(tempMax, min_value*nums[i]);
min_value = min(tempMin, min_value*nums[i]);
result = max(max_value, result);
};
return result;
}
};