[JavaScript 刷题] 搜索 - 组成整数的最小平方数数量, leetcode 279
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 组成整数的最小平方数数量, leetcode 279相关的知识,希望对你有一定的参考价值。
[javascript 刷题] 搜索 - 组成整数的最小平方数数量, leetcode 279
其实看到这个题目第一个想法是用 DP 去解决,后来绕了一圈发现,DP 解法和 BFS 的解法还是有点异曲同工之妙的。
题目如下:
Given an integer
n
, return the least number of perfect square numbers that sum ton
.A perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself. For example,
1
,4
,9
, and 16 are perfect squares while3
and11
are not.
解题思路
首先了解一下这道题要什么:
- 找出完美平方数的组合
- 该组合的和为传进去的值
- 需要使用最少数量的完美平方数去找到这个组合
以 13 为例,最简单的组合自然是 13 个 1——1 也是一个完美平方数,不过这样的组合肯定是没有办法满足需求的。
不过这样的问题也可以被 BFS 的特性所解决:
BFS 保证可以找到等重图中的最短路径,其中等重图也包括无重图。
这个问题里面结点到结点的路径是没有重量的,所以也就是无重图,而 BFS 可以找到无重图的最短路径:
当 n 的值为 12 时,所选择的路径就是 4-4-4
,这时已经找到了答案,函数已经被返回,之后下面就算还有其他非最短解,也属于无法到达的代码段。
值得注意的就是,这里所有结点的子结点为 小于等于 n 的所有完美平方数
,这也是为了应对像 1 这样的边界条件。
使用 JavaScript 解题
这里的 size
必须要声明一个变量去进行保存,否则 queue 的长度会在第三个循环中不断地变化,从而导致第二个循环无法结束,返回错误的答案。
之所以将 queue
的值初始为 0 也是为了循环体能够正常进行,queue
和 visited
中的 0 是途中的·,也就是当 度(degree) 为 0 时的结点。
1
, 4
, 9
分别对应第一层,这样也可以比较轻松地处理后面的逻辑。
/**
* @param number n
* @return number
*/
var numSquares = function (n)
let count = 0;
const queue = [0];
const visited = new Set([0]);
while (queue.length > 0)
count++;
const size = queue.length;
for (let i = 0; i < size; i++)
const head = queue.shift();
for (let j = 1; j * j <= n; j++)
let curr = head + j * j;
if (curr === n) return count;
if (curr > n) break;
if (!visited.has(curr))
queue.push(curr);
visited.add(curr);
return count;
;
console.log(numSquares(12));
// console.log(numSquares(13));
以上是关于[JavaScript 刷题] 搜索 - 组成整数的最小平方数数量, leetcode 279的主要内容,如果未能解决你的问题,请参考以下文章
[JavaScript 刷题] 数据结构 - 树(tree)
[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79
[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79