完全平方數
阿新 • • 發佈:2020-11-27
題目
給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
示例 1:
輸入: n = 12 輸出: 3 解釋: 12 = 4 + 4 + 4. 示例 2:
輸入: n = 13 輸出: 2 解釋: 13 = 4 + 9.
解題思路
我們先用比較容易想到的動態規劃來解決這道題,我們知道n = 1
時,最少只需要 1 個完全平方數1
即可。問題就在於其他情況的狀態轉移方程。
dp[i]
:表示完全平方數和為i的 最小個數 初始狀態dp[i]
均取最大值i,即 1+1+...+1,i個1; dp[0] = 0轉移方程 : dp[i] = min(dp[i], dp[i-j*j]+1)
意思就是:完全平方數和為i的 最小個數 等於 當前完全平方數和為i的 最大個數 與 (完全平方數和為 i - j * j 的 最小個數 + 完全平方數和為 j * j的 最小個數) 可以看到 dp[j*j] 是等於1的
程式碼
//go func numSquares(n int) int { dp := make([]int, n+1) for i := 1; i <= n; i++ { dp[i] = i for j := 1; i-j*j >= 0; j++ { dp[i] = min(dp[i], dp[i-j*j]+1) } } return dp[n] } func min(x, y int) int { if x < y { return x }else { return y } }
地址:https://mp.weixin.qq.com/s/terXoH1YZgsMomv4IQIV7w