1. 程式人生 > >Leetcode 152.乘機最大子序列

Leetcode 152.乘機最大子序列

乘積最大子序列

給定一個整數陣列 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 element
15 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 };