完全平方数

题目

给定正整数 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

posted @ 2020-11-27 14:08  small_lei_it  阅读(262)  评论(0编辑  收藏  举报