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