前端算法-完全平方数

682 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第40天,点击查看活动详情

题目

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

输入: n = 12
输出: 3 
解释: 12 = 4 + 4 + 4

思路一

我们先创建一个array变量,他是一个做为储存状态的数组,他的长度是形参n+1,默认值全为0,我们用该数组来记录当前数值的所需完全平方数的最少数量,然后再使用循环对形参n进行循环,在循环中我们创建一个min变量他的值是Number的最大值,然后再使用循环对第一层循环的i变量进行循环,我们在该循环中使用Math.min函数获取当前min变量和array数组的i-j*j的最小值,然后我们将其得出的最小值重新赋值给min变量,依次往复,求出当前所需完全平方数的最少数量,然后将min变量+1赋值给array的i变量位置,最后我们将array的形参n位置的数据返回出去即可

var numSquares = function(n) {
    let array = new Array(n+1).fill(0); 
    for(let i=1; i<=n; i++){ 
        let min = Number.MAX_VALUE; 
        for(let j=1; j*j<=i; j++){ 
            min = Math.min(min, array[i - j * j]); 
        }
        array[i] = min + 1;
    }
    return array[n]; 
};

思路二

我们在先声明一个s变量,它的值是形参n与0.5进行乘方在使用Math.floor方法向下取整后的值,然后我们在判断当前s变量和s变量想乘是否等于n,如果等于则返回1,如果不是我们接下来声明f变量他的值默认是n,然后再判断f和8相余是否等于7,如果是则直接返回4,如果不是则进行循环,判断当前f变量和4相余是否等于0,如果是则一直进行循环,在循环中我们将f变量和4相除最后把值在赋值给f变量,在判断f变量和8相余是否等于7,如果是则直接返回4,则下来在声明一个a变量,默认值为0,然后再进行循环,当前的变量a和变量a相乘是否小于形参n,如果是则进入循环,在循环中我们使用Math.floor方法向下取整通过( n - a*a ) ** 0.5该公式得出的值,然后进行判断 b*b + a*a === n,如果满足则直接返回2,如果不是则将变量a自增1,循环结束后,如果没有返回值则直接返回3

var numSquares = function(n) {
    let s = Math.floor(n ** 0.5);
    if( s*s === n ) return 1;
    let f = n
    if(f % 8 === 7) return 4;
    while( f % 4 === 0 ){
        f /= 4
        if(f % 8 === 7) return 4;
    }
    let a = 0
    while( a*a < n ){
        b = Math.floor(( n - a*a ) ** 0.5)
        if( b*b + a*a === n ) return 2
        a++
    }
    return 3
};