[JavaScript 刷题] 搜索 - 组成整数的最小平方数数量, leetcode 279

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 组成整数的最小平方数数量, leetcode 279相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 搜索 - 组成整数的最小平方数数量, leetcode 279

其实看到这个题目第一个想法是用 DP 去解决,后来绕了一圈发现,DP 解法和 BFS 的解法还是有点异曲同工之妙的。

279. Perfect Squares

题目如下:

Given an integer n, return the least number of perfect square numbers that sum to n.

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 while 3 and 11 are not.

解题思路

首先了解一下这道题要什么:

  1. 找出完美平方数的组合
  2. 该组合的和为传进去的值
  3. 需要使用最少数量的完美平方数去找到这个组合

以 13 为例,最简单的组合自然是 13 个 1——1 也是一个完美平方数,不过这样的组合肯定是没有办法满足需求的。

不过这样的问题也可以被 BFS 的特性所解决:

BFS 保证可以找到等重图中的最短路径,其中等重图也包括无重图。

这个问题里面结点到结点的路径是没有重量的,所以也就是无重图,而 BFS 可以找到无重图的最短路径:

当 n 的值为 12 时,所选择的路径就是 4-4-4,这时已经找到了答案,函数已经被返回,之后下面就算还有其他非最短解,也属于无法到达的代码段。

值得注意的就是,这里所有结点的子结点为 小于等于 n 的所有完美平方数,这也是为了应对像 1 这样的边界条件。

使用 JavaScript 解题

这里的 size 必须要声明一个变量去进行保存,否则 queue 的长度会在第三个循环中不断地变化,从而导致第二个循环无法结束,返回错误的答案。

之所以将 queue 的值初始为 0 也是为了循环体能够正常进行,queuevisited 中的 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的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题Python96. 不同的二叉搜索树

[JavaScript 刷题] 数据结构 - 树(tree)

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79

LeetCode Java刷题笔记— 96. 不同的二叉搜索树