先把传入的数字开平方根,然后向下取整,这样就可以获取到一个最大的完全平方数 然后减去这个数的平方,直到传入的数字为0 这样就可以获取一组完全平方数

但是这样不一定是最少的 不过我们已经得到了最大的完全平方数,所以再用比这个小的数字依次用上面的逻辑得到多组数据,最后取最小的

提醒: 上面的操作在输入的数字叫大的时候会出现内存超出, 因为最后一组会是很多个1相加,为了避免 就从 n >= 4 开始 ,在这之前的就直接 return n 就好


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @return int整型
 */
function numSquares( n ) {
    // write code here
    function Squares (n, max) {
        let res = []
        while (n) {
            let sqrt = Math.min(Math.sqrt(n),max)
            let num = (Math.floor(sqrt) * Math.floor(sqrt))
            n -= num
            res.push(num)
        }
        return res.length
    }
    if (n < 4) return n
    let maxSqrt = Math.sqrt(n)
    let lengthArr = []
    while (maxSqrt > 1) {
        lengthArr.push(Squares(n,maxSqrt))
        maxSqrt--
    }
    return Math.min(...lengthArr)
}
module.exports = {
    numSquares : numSquares
};