1. 程式人生 > 實用技巧 >完全平方數

完全平方數

題目

給定正整數 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)

,其中, j是平方數, j=1~k,其中k*k要保證 <= i

意思就是:完全平方數和為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