完全平方数
题目
给定正整数 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
small_lei_it 技术无止境,追求更高。

浙公网安备 33010602011771号