思路:
类似动态规划的思路. 一个变量记录当前最大乘积, 一个记录最小的, 记录最小的是因为有可能负负得正直接小的就变成大的了. 然后遍历输入向量, 如果当前数字是负数, 咱们就交换最大乘积和最小乘积, 然后更新最大值和最小值. 对于最大值的更新规则是, 新的乘积如果大于等于原乘积, 那就保留, 否则就舍弃原来的结果, 直接用当前遍历到的那个数即可. 最小值相同的思路.
int maxProduct(vector<int>& nums) {
if (nums.empty())
return 0;
int maxProd = nums[0];
int minProd = nums[0];
int res = nums[0];
for (int i = 1; i < nums.size(); i++) {
if (nums[i] < 0)
swap(maxProd, minProd);
maxProd = max(maxProd * nums[i], nums[i]);
minProd = min(minProd * nums[i], nums[i]);
res = max(res, maxProd);
}
return res;
}