问题描述:
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
执行结果:
代码描述:
思路:从首个元素开始乘,记录最大值,和最小值,当遇到负数时,最大值和最小值就正好反过来了。maxSum始终保留计算过程中的最大值。
计算的过程中,会发现一个问题,由于没有小数的存在,所以,最终结果有三种情况:要么就是计算从开头到中间的前半段,要么计算从中间某个负数到最后,要么就是从头到尾都乘起来。所以乘到哪里,主要看有几个负数。
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size() == 0) return 0;
int len = nums.size();
int maxSum = nums[0]; // 最大先取首个元素
int imax = 1, imin = 1; // 最大最小都取1,对于乘法来说,不会影响后面的数
for(int i = 0; i < len; ++i)
{
if(nums[i] < 0) // 当遇到负数的时候,会把大值变小小值变大,
{
int temp = imax;
imax = imin;
imin = temp;
}
imax = max(imax*nums[i], nums[i]);
imin = min(imin*nums[i], nums[i]);
maxSum = max(maxSum, imax); // 始终保留最大值
}
return maxSum;
}
};