题目描述
- 类似找零钱,思路和代码框架基本上一样
思路 & 代码
- 考虑到这么一点:某完全平方数,肯定是由另一更小的完全平方数 + 一平方组成
- 比如 16 = 8 + 4 =
(
完
全
平
方
数
8
=
2
2
+
2
2
)
+
2
2
(完全平方数8=2^2 + 2^2) + 2^2
(完全平方数8=22+22)+22
- 那么好办了,直接用dp冲!
class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
for(int i = 1; i <= n; i++){
dp[i] = i;
for(int j = 1; i - j * j >= 0; j++){
dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
}
}
return dp[n];
}
}
- 时间复杂度为O(n * sqrt(n)),代码重点是for j的循环结束条件 & 状态转移方程
- 无注释版
class Solution {
public int numSquares(int n) {
int[] ans = new int[n + 1];
for(int i = 1; i <= n; i++) {
ans[i] = i;
for(int j = 1; j * j <= i; j++) {
ans[i] = Math.min(ans[i], ans[i - j * j] + 1);
}
}
return ans[n];
}
}