题目:
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 :
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
思路:
记录数组中每一个索引位置值包含进连乘末尾的最大最小值maxhere、minhere(这里记录最小值是因为负负相乘得正),并与全局最大连乘值maxsofar比较更新。
代码:
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size() == 0) {
return 0;
}
int maxhere, minhere, maxsofar = nums[0], maxpre = nums[0], minpre = nums[0];
for(int i = 1; i < nums.size(); i++) {
// 目前索引位置为尾的连乘最大/小的值
maxhere = max(nums[i], max(maxpre*nums[i], minpre*nums[i]));
minhere = min(nums[i], min(maxpre*nums[i], minpre*nums[i]));
// 目前为止全局所有连乘中最大的值
maxsofar = max(maxsofar, maxhere);
maxpre = maxhere;
minpre = minhere;
}
return maxsofar;
}
};
输出: