乘积最大子数组
分析
和最大子段和差不多,只是这里其实有点小区别就是会有负数的出现,其实我们可以维护两个极端,一个是最大值一个是最小值,然后当nums[i]是负数的时候,就开始使用最小值更新答案,否则使用最大值更新答案.
class Solution {
public:
#define ll long long
int maxProduct(vector<int>& nums) {
ll ans = -1e18;
int curMax = 1, curMin = 1;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] < 0) {
swap(curMax, curMin);
}
curMax = max(nums[i], curMax * nums[i]);
curMin = min(nums[i], curMin * nums[i]);
ans = max(ans, (ll)curMax);
}
return (int)ans;
}
};