File tree 1 file changed +55
-0
lines changed
1 file changed +55
-0
lines changed Original file line number Diff line number Diff line change
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
+ ```
You can’t perform that action at this time.
0 commit comments