Skip to content

Commit 6bfbaa0

Browse files
Create 279. 完全平方数.md
1 parent 4a06782 commit 6bfbaa0

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#### 279. 完全平方数
2+
3+
难度:中等
4+
5+
---
6+
7+
给你一个整数 `n` ,返回 _和为 `n` 的完全平方数的最少数量_
8+
9+
**完全平方数** 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,`1``4``9``16` 都是完全平方数,而 `3``11` 不是。
10+
11+
**示例 1:**
12+
13+
```
14+
输入:n = 12
15+
输出:3
16+
解释:12 = 4 + 4 + 4
17+
```
18+
19+
**示例 2:**
20+
21+
```
22+
输入:n = 13
23+
输出:2
24+
解释:13 = 4 + 9
25+
```
26+
27+
 
28+
29+
**提示:**
30+
31+
* `1 <= n <= 10^4`
32+
33+
---
34+
35+
动态规划:
36+
37+
`dp[i]` 指和为 `i` 的完全平方数的最少数量。状态转移方程为 $dp[i] = \min_{j = 1, .., \sqrt i}dp[i - j * j] + 1$。最少数量肯定是当前值减去一个完全平方数得到的,但是具体哪个完全平方数,需要遍历得到。
38+
39+
[322. 零钱兑换](https://leetcode.cn/problems/coin-change/solutions/132979/322-ling-qian-dui-huan-by-leetcode-solution/) 类似!
40+
41+
```Java
42+
class Solution {
43+
public int numSquares(int n) {
44+
int[] dp = new int[n + 1];
45+
for(int i = 1; i <= n; i++){
46+
int minn = Integer.MAX_VALUE;
47+
for(int j = 1; j * j <= i; j++){
48+
minn = Math.min(minn, dp[i - j * j]);
49+
}
50+
dp[i] += minn + 1;
51+
}
52+
return dp[n];
53+
}
54+
}
55+
```

0 commit comments

Comments
 (0)