Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
int maxProduct(vector<int>& nums) { // time: O(n); space: O(n)
if (nums.empty()) return 0;
int n = nums.size();
vector<vector<int> > dp(n, vector<int>(2, 0));
dp[0][0] = nums[0];
dp[0][1] = nums[0];
int res = nums[0];
for (int i = 1; i < n; ++i) {
dp[i][0] = min({nums[i], nums[i] * dp[i - 1][0], nums[i] * dp[i - 1][1]});
dp[i][1] = max({nums[i], nums[i] * dp[i - 1][0], nums[i] * dp[i - 1][1]});
res = max(res, dp[i][1]);
}
return res;
}
int maxProduct(vector<int>& nums) { // time: O(n); space: O(1)
if (nums.empty()) return 0;
int n = nums.size();
int res = nums[0];
for (int i = 1, mn = res, mx = res; i < n; ++i) {
if (nums[i] < 0) swap(mn, mx);
mn = min(nums[i], nums[i] * mn);
mx = max(nums[i], nums[i] * mx);
res = max(res, mx);
}
return res;
}