LeetCode 152. 乘积最大子序列(DP)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 152. 乘积最大子序列(DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目信息
- 2. 解題
1. 題目信息
給定一個整數數組 nums ,找出一個序列中乘積最大的連續子序列(該序列至少包含一個數)。
示例 1:輸入: [2,3,-2,4] 輸出: 6 解釋: 子數組 [2,3] 有最大乘積 6。 示例 2:輸入: [-2,0,-1] 輸出: 0 解釋: 結果不能為 2, 因為 [-2,-1] 不是子數組。來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-product-subarray
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
包含每個數的序列的最大乘積記為dpmax[i],最小乘積dpmin[i]
則nums[i] > 0 時,dpmax[i]=max(dpmax[i?1])?nums[i],nums[i])dpmax[i] = max(dpmax[i-1])*nums[i], nums[i])dpmax[i]=max(dpmax[i?1])?nums[i],nums[i])
nums[i] < 0 時,dpmax[i]=max(dpmin[i?1])?nums[i],nums[i])dpmax[i] = max(dpmin[i-1])*nums[i], nums[i])dpmax[i]=max(dpmin[i?1])?nums[i],nums[i])
同時記得維護dpmin[i]
對前面的狀態進行壓縮,可以節省空間
class Solution { public:int maxProduct(vector<int>& nums) {int dp_max, dp_min, maxProduct, pre_dp_max;maxProduct = dp_max = dp_min = pre_dp_max = nums[0];for(int i = 1; i < nums.size(); ++i){pre_dp_max = dp_max;if(nums[i] >= 0){dp_max = max(nums[i]*dp_max, nums[i]);dp_min = min(nums[i]*dp_min, nums[i]);}else//nums[i] < 0{ dp_max = max(nums[i]*dp_min, nums[i]);dp_min = min(nums[i]*pre_dp_max, nums[i]);//dp_max改了,需要臨時變量記住上次的}if(dp_max > maxProduct)maxProduct = dp_max;}return maxProduct;} };總結
以上是生活随笔為你收集整理的LeetCode 152. 乘积最大子序列(DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 349. 两个数组的交
- 下一篇: LeetCode 1078. Bigra