1. 程式人生 > >LeetCode 343.Integer Break題解

LeetCode 343.Integer Break題解

題目

題目連結
隨機給你一個大於2的正整數,讓你將其拆分(這意味這至少將其拆分為兩個數),比如10可以拆分為3+3+4。最後你需要得出一種拆分方式,使得所有數之積最大。10的結果為3*3*4=36

思路

數學方法

有大佬經過觀察,得出結論:

1.要想得到最大值,需要將所有的數拆分成2或3
2.能拆分成3就優先考慮3

這個連結的解釋說得很清楚,大家可以看一下。

我的思路

這道題屬於動態規劃類的,我就琢磨著怎麼找到轉移方程。

  1. 我們可以先開闢一個數組dp[n+1],保證每個dp[i]儲存對應數字i的最大拆分結果
  2. 那麼,我們通過遍歷i之前的所有最大拆分結果dp[j]
    ,結果dp[i] = Math.max( dp[i], dp[j] * (i-j) );

看似思路很對,但裡面還有一個坑。我們有兩個特殊的數字需要處理:23dp[2] = 1dp[3] = 2,這兩個數字是兩個最大拆分結果小於本身的數字,所以如果j為2或3,我們不如使用j本身,反而比使用dp[j]更大。

程式碼實現(Java)

public int integerBreak(int n) {
        int[] dp = new int[n+1];
        dp[1] = 1;
        dp[2] = 1;

        for(int i = 3
; i <= n; i++) { for(int j = 1; j < i; j++) { int diff; if( j == 2 || j == 3) { diff = j * (i-j); } else { diff = dp[j] * (i-j); } dp[i] = Math.max(dp[i], diff); } } return
dp[n]; }