题目链接:LeetCode 152 乘积最大子数组
题目大意:
给你一个整数数组\(nums\),请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
题解:
由于数组中存在负数,所以需要同时记录当前最大值和当前最小值。
设\(maxAns[i]\)表示以第\(i\)个元素结尾的乘积最大子数组的乘积,\(minAns[i]\)表示以第\(i\)个元素结尾的乘积最小子数组的乘积。
状态转移方程:
由于\(maxAns[i]\)和\(minAns[i]\)仅与\(maxAns[i - 1]\)和\(minAns[i - 1]\)有关,所以可以使用滚动数组压缩空间。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int maxAns, minAns, ans;
maxAns = minAns = ans = nums[0];
for (int i = 1; i < nums.size(); ++i) {
int maxn = maxAns, minn = minAns;
maxAns = max(nums[i], max(maxn * nums[i], minn * nums[i]));
minAns = min(nums[i], min(maxn * nums[i], minn * nums[i]));
ans = max(ans, maxAns);
}
return ans;
}
};