152. Maximum Product Subarray

来源:互联网 发布:天下足球 知乎 编辑:程序博客网 时间:2021/01/17 11:17

1. 原题

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.

2. 分析

  • 这个数组至少1个数, 而且可能含有负数, 0, 正数。
  • 采用动态规划,考虑只有一种符号和0的情况, 以dp[i]表示在下标为 i 的时候的乘积,那么 dp[i]=minmax(dp[i1]nums[i],nums[i]).这里max就是修正0的存在带来的变化。比如:[1,0,2], [-1, 0, -2]这些情况
  • 在考虑同时有正负的时候, 使用positive[i]negative[i]数组来分别表示在下标为i处的正负数子数组的最大乘积。递归式如下。
 if (nums[i] < 0){                positive[i] = negative[i-1] * nums[i];                negative[i] = min(positive[i-1]*nums[i], nums[i]);            } if (nums[i] > 0){                positive[i] = max(positive[i-1] * nums[i], nums[i]);                negative[i] = negative[i-1] * nums[i];            }
  • 初始化positive,negative的时候, 初始化为0,因为在上面的递归式中, 如果i-1的符号和i 的符号不一样, 那么positive[i1]nums[i]==0negative[i1]nums[i]==0。一个正数的对应的下标 i 在negative数组中是0,反之同理

3. 代码

class Solution {public:    int maxProduct(vector<int>& nums) {        int len = nums.size();        if (len == 1) return nums[0];        vector<int> positive(len, 0);        vector<int> negative(len, 0);        int ans = nums[0];        if (nums[0] > 0)            positive[0] = nums[0];        if (nums[0] < 0)            negative[0] = nums[0];        for (int i = 1; i < len; i++){            if (nums[i] < 0){                positive[i] = negative[i-1] * nums[i];                negative[i] = min(positive[i-1]*nums[i], nums[i]);            }            if (nums[i] > 0){                positive[i] = max(positive[i-1] * nums[i], nums[i]);                negative[i] = negative[i-1] * nums[i];            }            if (positive[i] > ans){                ans = positive[i];            }            if (negative[i] > ans){                ans = negative[i];            }        }        return ans;    }    /*    2    -1     1     1P   2     0     1     1  N   0    -2    -2    -2    */};