LeetCode每日一題5月18日 LeetCode152,乘積最大子數組

問題描述:

給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),並返回該子數組所對應的乘積。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-product-subarray

示例 1:

輸入: [2,3,-2,4]
輸出: 6
解釋: 子數組 [2,3] 有最大乘積 6。

示例 2:

輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能爲 2, 因爲 [-2,-1] 不是子數組。

解題思路:

這個和最大子序和有異曲同工之妙:最大子序和

這是最大子序和的動態方程

dp[i+1] = max(dp[i]+nums[i+1],nums[i+1])

本題也是使用動態規劃,不過乘積會出現負負得正的情況因此我們需要統計倆個值,前部分的乘積的最大值,最小值

假設maxnum[i]代表從0-i的最大子序乘積

        minnum[i]代表從0-i的最小子序乘積(主要是用了統計負值)

則動態方程可以寫成:dp[i+1] = max({maxnum[i]*num[i+1],minnum[i]*num[i+1],num[i+1]})

完整代碼如下:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int minnum=1,maxnum=1;
        int maxres = INT_MIN;
        for(int i=0;i<nums.size();i++){
            int aa = minnum*nums[i];
            int bb = maxnum*nums[i];

            minnum = min({nums[i],aa,bb});
            maxnum = max({nums[i],aa,bb});

            maxres = max(maxres,maxnum);
        }
        return maxres;
    }
};

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章