Leetcode 152. 乘积最大子序列

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

示例 1:

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

示例 2:

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

这里用动态规化的方法,即dp[i]为以i结尾乘积最大连续数值,注意,由于有负数的存在,需要同时记录最大值与最小值,因为负数的最小值再与正数可能出现最大值,所以用dp[i][0]表示最大值,dp[i][1]表示最小值,考虑到特殊情况,每次求最大值和最小值都要与当前数组nums[i]比较。实际上不需要记录下所有dp[i],只需记录当前的dp和上一个状态的dp[i],所以用滚动数组技巧

class Solution {
public:
    int maxProduct(vector<int>& nums) 
    {
        vector<vector<int>> dp(2, vector<int>(2, 0));
        dp[0][0]=nums[0];       // 正最大值
        dp[0][1]=nums[0];       // 最小值
        int n=nums.size();
        int res=nums[0];
        int x,y;
        for(int i=1;i<n;i++)
        {
            x=i%2;                // 滚动数组
            y=(i-1)%2;            // 滚动数组
           dp[x][0]=max(dp[y][0]*nums[i],dp[y][1]*nums[i]);
           dp[x][0]=max(dp[x][0],nums[i]);
           dp[x][1]=min(dp[y][1]*nums[i],dp[y][0]*nums[i]);
           dp[x][1]=min(dp[x][1],nums[i]);
           res=max(res,dp[x][0]);
        }
        
        return res;
    
        
    }
};

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/86260576