給你乙個整數陣列 nums ,請你找出陣列中乘積最大的連續子陣列(該子陣列中至少包含乙個數字),並返回該子陣列所對應的乘積。
示例 1:輸入: [
2,3,-2,4
]輸出:
6解釋: 子陣列 [
2,3] 有最大乘積 6
。示例 2:
輸入: [-2,0,-1
]輸出:
0解釋: 結果不能為
2, 因為 [-2,-1] 不是子陣列。
雙重for迴圈,以陣列中每個下標開始,迭代更新乘積最大的連續子陣列。時間複雜度o(n2)
首先本題與lc 53.最大子序和類似,53題的轉移方程為dp[i]=max(dp[i-1]+nums[i],nums[i]),dp[i]僅僅與前乙個狀態有關,因為題目要求是連續子陣列。回到本題中,如果只考慮陣列中只會出現正數,那麼這道題就和53題的思路是一樣的,狀態轉移方程也是一樣的:dp[i]=max(dp[i-1]*nums[i],nums[i]),但是本題中陣列中是會出現不定個數的負數,如果只有乙個負數,上述狀態轉移方程是沒有問題的,但是如果出現兩個負數就會產生問題,因為負負得正,比如陣列[2,3,-3,-4]。,那麼第乙個符號之前所有的乘積就都要考慮在dp[i]裡面,但是用上述方程,早在第乙個負數出現的時候,它前面的乘積都已經丟掉了,所以這才是為什麼還需要記錄乙個最小值,說白了,最小值只有是負數出現的時候才會在這道題發揮它的用處,否則,最小值和最大值都是一樣的。所以對於dp[i]來說,dp[i-1]可能是最大值也可能是最小值,若nums[i]>0,則dp[i-1]記錄的是》0的最大值,則沒問題,若nums[i]<0,dp[i-1]就應該記錄的是<0的最小值,這樣才能產生最大值。所以改進後的狀態轉移方程如下:
maxf[i] = max(minf[i - 1] * nums[i], max(nums[i], maxf[i - 1] * nums[i]));
minf[i] = min(maxf[i - 1] * nums[i], min(nums[i], minf[i - 1] * nums[i]));
1class
solution 13}
14return
ans;15}
16 };
1class
solution
11return
ans;12}
13 };
因為當前狀態只有前乙個狀態有關,所以可以把空間複雜度從o(n)優化至o(1)
1class
solution
14return
ans;15}
16 };
Leetcode 152 乘積最大子串行
原題描述 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 例如,給定序列 2,3,2,4 其中乘積最大的子串行為 2,3 其乘積為6。解答 1.暴力搜尋 o n 2 沒有ac 超時 class solution return max 2.動態規劃思想,max min 每有乙個新的數字加入,...
Leetcode 152 乘積最大子串行
給定乙個整數陣列nums,找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0解釋 結果不能為 2,因為 2,1 不是子陣列。這裡用動態規化的方法,即dp i 為以i結尾乘積最大連...
leetcode152 乘積最大子串行
給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。用三個變數分別記錄最大值,到之前乙個數的最大值和...