日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

343. Integer Break

發布時間:2024/5/7 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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),則有一下兩種方案:

  • 將 i 拆分成 j 和 i-j 的和,且 i-j 不再拆分成多個正整數,此時的乘積是j×(i?j);
  • 將 i 拆分成 j 和 i?j 的和,且 i?j 繼續拆分成多個正整數,此時的乘積是j×dp[i?j]。
  • 當 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。