LeetCode:88.乘积最大子数组
目录
1.乘积最大的子数组
1.乘积最大的子数组
对于这道题,我们只通过一个状态转移方程是解决不了的,因为前面的乘积中可能会存在负数这种情况,我们应当用两个来解决
设f[i]表示以i位置结尾的子数组的最大乘积,g[i]表示以i位置结尾的子数组的最小乘积
f[i]可分为以下情况:
- 长度为1,f[i] = nums[i]
- 长度不为1,如果nums[i] > 0的话,想要保证乘积最大,那么i-1前面的乘积也要为最大,f[i] = f[i - 1] * nums[i],如果nums[i] < 0的话,要最大,i - 1的乘积应该是一个最小的乘积表示为负数,这样相乘才会最大,f[i] = g[i - 1] * nums[i]
g[i]的情况与f[i]一样
class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1), g(n + 1);f[0] = g[0] = 1;int ret = INT_MIN;for(int i = 1; i <= n; i++){int x = nums[i - 1], y = f[i - 1] * nums[i - 1], z = g[i - 1] * nums[i - 1];f[i] = max(x, max(y, z));g[i] = min(x, min(y, z));ret = max(f[i], ret);}return ret;}
};