Category | Difficulty | Likes | Dislikes |
---|
algorithms | Medium (66.22%) | 1773 | - |
Tags
math
| dynamic-programming
| breadth-first-search
Companies
google
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
1
2
3
| 输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
|
示例 2:
1
2
3
| 输入:n = 13
输出:2
解释:13 = 4 + 9
|
提示:
Discussion | Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| struct Solution;
// @lc code=start
impl Solution {
/// ## 解题思路
/// - bfs
pub fn num_squares1(n: i32) -> i32 {
use std::collections::VecDeque;
let mut res = 0;
let mut q = VecDeque::new();
q.push_back(n);
let mut found = false;
while !found && !q.is_empty() {
res += 1;
for _ in 0..q.len() {
let n = q.pop_front().unwrap();
for i in (1..=((n as f32).sqrt().floor() as i32))
.map(|i| i * i)
.filter(|&i| i <= n)
{
if i == n {
return res;
}
q.push_back(n - i);
}
}
}
res
}
/// - 动态规划
/// 1. 设: dp[i]: i的完全平方数个数
/// 2. 目标: dp[n]
/// 3. dp[i] = min(dp[j]) + 1 ( 0<j<i, 且(i-j)为完全平方数)
pub fn num_squares(n: i32) -> i32 {
let mut dp = (0..n + 1).collect::<Vec<_>>();
for i in 2..=(n as usize) {
dp[i] = (1..=(i as f32).sqrt().floor() as usize)
.map(|j| dp[i - j * j] + 1)
.min()
.unwrap();
}
dp[n as usize]
}
}
// @lc code=end
|