思路:dp
由于是找连续子数组,所以只能跟前一个状态有关系!!!
类似最大连续子序列和:dp[i] = max(dp[i - 1] * nums[i], nums[i]);
最大的区别:
最大连续子序列和:加法中当前值加上一个较大的值,得到的值更大。
然而该题:乘法中,当前值乘以一个较大值不一定较大,比如:-1 从 (-1 -5)中,乘以-5反而更大,因此乘以最大值,或者乘以最小值更大!!!
状态:dp[i][0]记录[i]结尾的最小值 dp[i][1]记录最大值
转移方程:
dp[i][0]=min(dp[i-1][0]*nums[i],dp[i-1][1]*nums[i],nums[i]);
dp[i][1]=max(dp[i-1][0]*nums[i],dp[i-1][1]*nums[i],nums[i]);
ans:dp[i][1]中最大的值。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
int _0 = nums[0], _1 = nums[0], ans = nums[0];
for (int i = 1; i < n; ++i) {
int tmp0 = min(min(_0 * nums[i], _1 * nums[i]), nums[i]);
int tmp1 = max(max(_0 * nums[i], _1 * nums[i]), nums[i]);
_0 = tmp0;
_1 = tmp1;
ans = max(ans, _1);
}
return ans;
}
};