持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
题目(Perfect Squares)
链接:leetcode-cn.com/problems/pe… 解决数:1830 通过率:65.7% 标签:广度优先搜索 数学 动态规划 相关公司:google amazon bytedance 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
输入:n = 12 输出:3 解释:12 = 4 + 4 + 4 示例 2:
输入:n = 13 输出:2 解释:13 = 4 + 9
提示:
1 <= n <= 104
思路
动态规划
- 首先初始化长度为
n+1的数组dp,每个位置都为0 - 如果
n为0,则结果为0 - 对数组进行遍历,下标为
i,每次都将当前数字先更新为最大的结果,即dp[i]=i,比如i=4,最坏结果为4=1+1+1+1即为4个数字 - 动态转移方程为:
dp[i] = MIN(dp[i], dp[i - j * j] + 1),i表示当前数字,j*j表示平方数 - 时间复杂度:,sqrt 为平方根
class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1]; // 默认初始化值都为0
for (int i = 1; i <= n; i++) {
dp[i] = i; // 最坏的情况就是每次+1
for (int j = 1; i - j * j >= 0; j++) {
dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程
}
}
return dp[n];
}
}
/**
* @param {number} n
* @return {number}
*/
var numSquares = function(n) {
const dp = [...Array(n+1)].map(_=>0); // 数组长度为n+1,值均为0
for (let i = 1; i <= n; i++) {
dp[i] = i; // 最坏的情况就是每次+1
for (let j = 1; i - j * j >= 0; j++) {
dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程
}
}
return dp[n];
};
BFS
/**
* @param {number} n
* @return {number}
*/
var numSquares = function(n) {
let queue = [n];
let visited = {};
let level = 0;
while(queue.length > 0) {
// 层序遍历
level++;
let len = queue.length;
for(let i = 0;i < len;i++){
let cur = queue.pop();
for(let j = 1;j*j <= cur;j++){
let tmp = cur - j*j;
// 找到答案
if(tmp === 0) {
return level;
}
if(!visited[tmp]){
queue.unshift(tmp);
visited[tmp] = true;
}
}
}
}
return level;
};