LeetCode 343.Integer Break題解
阿新 • • 發佈:2019-02-14
題目
題目連結
隨機給你一個大於2的正整數,讓你將其拆分(這意味這至少將其拆分為兩個數),比如10可以拆分為3+3+4。最後你需要得出一種拆分方式,使得所有數之積最大。10的結果為3*3*4=36
。
思路
數學方法
有大佬經過觀察,得出結論:
1.要想得到最大值,需要將所有的數拆分成2或3
2.能拆分成3就優先考慮3
這個連結的解釋說得很清楚,大家可以看一下。
我的思路
這道題屬於動態規劃類的,我就琢磨著怎麼找到轉移方程。
- 我們可以先開闢一個數組
dp[n+1]
,保證每個dp[i]
儲存對應數字i
的最大拆分結果 - 那麼,我們通過遍歷
i
之前的所有最大拆分結果dp[j]
dp[i] = Math.max( dp[i], dp[j] * (i-j) );
看似思路很對,但裡面還有一個坑。我們有兩個特殊的數字需要處理:2
和3
。dp[2] = 1
和dp[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];
}