解题思路:
求乘积最大的子序列,不同于和最大的子序列,两个负数相乘是会得到正数的,所以在遍历数组nums时,需要存储最大和最小的子序列乘积。然后每遍历一个元素,更新一次。
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.empty()) return 0;
int n = nums.size();
int imax = nums[0]; //存储当前最大值
int imin = nums[0]; //存储当前最小值
int res = nums[0]; //存储结果
for(int i = 1; i < n; i++){
int tmp = imax; //要先把imax缓存起来,不然就会被下面的赋值语句更新掉
imax = max(nums[i], max(nums[i]*imax, nums[i]*imin));
imin = min(nums[i], min(nums[i]*tmp, nums[i]*imin));
res = max(res, imax);
}
return res;
}
};