LeetCode 152 乘积最大子数组

题目

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

思路

动态规划问题,但是无法像最长连续子序列那样来处理。
最长连续子序列问题中,我们维护了以第i元素为结尾的最大连续自序列和,那么我们在这个问题中,也维护一个以第i元素为结尾的最大连续自序列积maxD[i]
因为当前位置的最优解未必是由前一个位置的最优解转移得到的,简单来说,由于序列种存在负数,那么会导致当前最大的乘积变最小的,最小的变最大的
因此还要维护以第i元素为结尾的最小连续自序列积minD[i],当更新本状态的maxD时,也要参考minD[i - 1] * A[i]
综上,在更新本状态时,一共有三种情况,maxD[i-1]*A[i],mind[i-1]*A[i],A[i]
记得输出maxD[i]的最大值。

代码

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        vector<int> maxD(nums), minD(nums);
        int maxt = nums[0];
        for(int i = 1; i < nums.size(); i++){
            maxD[i] = max(maxD[i-1] * nums[i], max(nums[i], minD[i-1] * nums[i]));
            minD[i] = min(maxD[i-1] * nums[i], min(nums[i], minD[i-1] * nums[i]));
            maxt = max(maxD[i], maxt);
        }
        return maxt;
    }
};
posted @ 2020-05-17 22:41  阳离子  阅读(139)  评论(0编辑  收藏  举报