给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解析:本题与加法版的不同,对于相同的数,加法中大的数加上这个数一定比小的数加上这个数要大,因此只需要维护一个当前最大值即可。
但是对于乘法,一个大数乘上一个负数,立刻就会变成一个非常小的数。同理一个负数乘上一个负数也会变成一个正数。
因此我们需要维护两个变量。max与min
其中max用来记录以当前访问的数为最终结束节点的连续子序列的最大乘积
min用来记录以当前节点为最终结束节点的连续最子序列的最小乘积
另外一个点在于,当当前节点为负数时,最大乘积乘一个负数将会小于最小乘积乘负数
因此我们需要将max与min进行交换,然后再进行下一步处理
class Solution {
public:
int maxProduct(vector<int>& nums) {
int res = INT_MIN;
int Max = 1;
int Min = 1;
for(auto i:nums){
if(i<0) swap(Max,Min);
Max = max(Max*i,i);
Min = min(Min*i,i);
res = max(res,Max);
}
return res;
}
};