Skip to content

Latest commit

 

History

History
46 lines (39 loc) · 1.59 KB

152. Maximum Product Subarray.md

File metadata and controls

46 lines (39 loc) · 1.59 KB

152. 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:

输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

解法一:

//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int res = INT_MIN;
        int maxP = 1, minP = 1;
        for(int num : nums) {
            if(num < 0) swap(maxP, minP);
            maxP = max(num, maxP * num);
            minP = min(num, minP * num);
            res = max(maxP, res);
        }
        return res;
    }
};

解法一:

动态规划。设置一个数组dp[n],其中dp[i]代表数组中前i项组成的序列所能得到的最大子序列乘积,题上要求序列至少1个元素,显然dp[0] = nums[0]。

如果nums中元素非负,很容易想出其递推关系为dp[i] = max(num, dp[i - 1] * num);。为了节省空间,可以只记录上一步的dp,也就是maxP。

问题在于nums中有负数,负负得正,那我们需要维护一个最小值minP,如果遇到负数,就交换maxP和minP。

2019/12/30 00:00