343. Integer Break
給定一個正整數 n,將其拆分為至少兩個正整數的和,并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
說明: 你可以假設 n 不小于 2 且不大于 58。
動態規劃
數組dp,其中dp[i]表示將正整數i拆分成至少兩個正整數的和之后,這些正整數的最大乘積。
邊界情況:0不是正整數,1是最小的正整數,都不可拆分,因此dp[0]=dp[1]=0。
當i>=2時,假設對正整數i拆分出的第一個正整數是j(1<=j<i),則有一下兩種方案:
當 j 固定時,有 dp[i]=max(j×(i?j),j×dp[i?j])。
由于 j 的取值范圍是 1 到 i-1,需要遍歷所有的 j 得到 dp[i] 的最大值,因此可以得到狀態轉移方程如下:
最終得到 dp[n] 的值即為將正整數 n 拆分成至少兩個正整數的和之后,這些正整數的最大乘積。
Code
def integerBreak(self, n: int) -> int:dp = [0 for _ in range(n + 1)]for i in range(2, n + 1):for j in range(1, i):dp[i] = max(dp[i], j * (i - j), j * dp[i - j])return dp[n]復雜度分析
時間復雜度:O(n2),其中 n 是給定的正整數。對于從 2 到 n 的每一個整數都要計算對應的 dp 值,計算一個整數對應的 dp 值需要 O(n) 的時間復雜度,因此總時間復雜度是 O(n2)。
空間復雜度:O(n),其中 n 是給定的正整數。創建一個數組 dp,其長度為 n+1。
總結
以上是生活随笔為你收集整理的343. Integer Break的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django REST framewor
- 下一篇: 2013\National _C_C++