Leetcode 152.乘機最大子序列
阿新 • • 發佈:2018-12-29
乘積最大子序列
給定一個整數陣列 nums ,找出一個序列中乘積最大的連續子序列(該序列至少包含一個數)。
示例 1:
輸入: [2,3,-2,4]
輸出: 6
解釋: 子陣列 [2,3] 有最大乘積 6。
示例 2:
輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。
解題思路:乘法與加法最大差別在於,當前元素的符號具有全域性性的作用。
如果當前元素為負,那麼連乘到上個元素的最大乘積,再乘以當前元素,就變成負數,甚至可能成為最小乘積。
同樣,連乘到上個元素的最小乘積如為負,再乘以當前元素,就變成正數,甚至可能成為最大乘積。
因此使用動態規劃的方法:
記maxLast/minLast為連乘到上個元素的最大/小乘積
記maxCur/minCur為連乘到當前元素的最大/小乘積
記maxAll為全域性最大乘積
1 class Solution{ 2 public: 3 int maxProduct(vector<int>& nums){ 4 if (nums.empty()){ 5 return 0; 6 } 7 if (nums.size() == 1){8 return nums[0]; 9 } 10 int maxAll = nums[0];//global maximum 11 int maxLast = nums[0];//maximum including last element 12 int maxCur;//maximum including current element 13 int minLast = nums[0];//minumum including current element 14 int minCur;//minimum including last element15 for (int i = 1; i<nums.size(); i++){ 16 maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i])); 17 minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i])); 18 maxLast = maxCur; 19 minLast = minCur; 20 maxAll = max(maxAll, maxCur); 21 } 22 return maxAll; 23 } 24 };