zoukankan      html  css  js  c++  java
  • [LeetCode][JavaScript]Perfect Squares

    Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

    For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

    https://leetcode.com/problems/perfect-squares/


    一个数如果是perfect square,这个数可以拆成若干个平方数相加,求最少需要几个平方数,隐含的意思是一定有解,因为有1在。

    因为要找最少需要几个平方数,选择用BFS,如果找到了结果,搜索的层数就是答案。

    首先找所有小于n的平方数,放入prime数组中。

    开一个队列,一开始队列中只有n,每轮遍历将队列中所有的数,减去所有的平方数,把减下来的数继续放入队列中,在下一轮的遍历使用。下图就是BFS的过程。

    如果减到最后结果是0,说明找到了答案。

    使用哈希表(也可以是set)代替队列,因为有很多重复的数字,不去重一定会超时。

      

     1 /**
     2  * @param {number} n
     3  * @return {number}
     4  */
     5 var numSquares = function(n) {
     6     var prime = [], queue = {},
     7         sqrt = Math.floor(Math.sqrt(n));
     8     for(var i = 1; i <= sqrt; i++)
     9         prime.push(i * i);
    10     queue[n] = true;
    11     return bfs(queue, 1);
    12 
    13     function bfs(queue, depth){
    14         var i, j, newQueue = {}, tmp;
    15         for(i in queue){
    16             for(j = 0; j < prime.length; j++){
    17                 tmp = Math.floor(i) - prime[j];
    18                 if(tmp === 0)
    19                     return depth;
    20                 if(tmp < 0)
    21                     break;
    22                 if(tmp > 0)
    23                     newQueue[tmp] = true;
    24             }
    25         }
    26         return bfs(newQueue, depth + 1);
    27     }
    28 };

    稍微修改一下代码,可以知道n是由哪个数相加而来。

     1 /**
     2  * @param {number} n
     3  * @return {number}
     4  */
     5 var numSquaresDetail = function(n) {
     6     var prime = [], queue = {},
     7         sqrt = Math.floor(Math.sqrt(n));
     8     for(var i = 1; i <= sqrt; i++)
     9         prime.push(i * i);
    10     queue[n] = [];
    11     return bfs(queue, 1).sort(sorting).join(' + ');
    12 
    13     function bfs(queue){
    14         var i, j, newQueue = {}, tmp, arr;
    15         for(i in queue){
    16             for(j = 0; j < prime.length; j++){
    17                 tmp = Math.floor(i) - prime[j];
    18                 arr = queue[i].slice(0);
    19                 arr.push(prime[j]);
    20                 if(tmp === 0)
    21                     return arr;
    22                 if(tmp < 0)
    23                     break;
    24                 if(tmp > 0)                
    25                     newQueue[tmp] = arr;
    26             }
    27         }
    28         return bfs(newQueue);
    29     }
    30     function sorting(a, b){
    31         return a - b;
    32     }
    33 };
  • 相关阅读:
    《团队-Android手机便签-项目进度》
    《结对-结对编项目作业名称-测试过程》
    《结对-结对编项目作业名称-开发过程》
    ios auto layout demystified (二)
    ios auto layout demystified (一)
    电子书下载地址
    轻应用、Web app 、Native app三者区别关系是什么?
    ios录制测试
    Understanding apps: mobile, native or responsive
    iOS开发工具——网络封包分析工具Charles
  • 原文地址:https://www.cnblogs.com/Liok3187/p/5225484.html
Copyright © 2011-2022 走看看