算法题解- 平方数

172 阅读2分钟

题目

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

输入: n = 12
输出: 3 

题解

第一种

我们在函数中声明一个数组m,长度为n+1,并用0填充,这个数组用于存储每个数的最少完全平方数的个数,然后我们使用一个循环来遍历从1到n的每个数,循环的目的是计算每个数的最少完全平方数的个数,在循环中,我们先初始化一个变量mins表示当前数的最少完全平方数的个数,我们将其设置为一个较大的值Number.MAX_VALUE,以便在后面的比较中找到更小的值,然后我们使用另一个循环来遍历从1到当前数的所有完全平方数,循环的目的是找到当前数减去一个完全平方数后的数,然后查找该数的最少完全平方数的个数,并将其与mins进行比较,更新mins为较小的值,最后我们将mins+1的值赋给数组m中的当前数索引,表示当前数的最少完全平方数的个数,循环结束后我们将数组m中索引为n的值返回即可

var numSquares = function(n) {
    const m=new Array(n+1).fill(0)
    for(let i=1;i<=n;i++){
        let mins=Number.MAX_VALUE
        for(let j=1;i>=j*j;j++){
            mins=m[i-j*j]<mins ? m[i-j*j]:mins
        }
        m[i]=mins+1
    }
    return m[n]
};

第二种

我们先声明一个空数组nums,用于存储平方数,然后使用一个循环,从0到99,将每个数的平方存储在nums数组中,这样的话nums数组中的元素就是从1到100的完全平方数,然后我们声明了一个长度为n+1的数组dp,并将其填充为最大值Number.MAX_VALUE,这个数组用于存储每个数的最少完全平方数的个数,dp[0]被初始化为0,表示0本身就是一个完全平方数,然后我们使用两个嵌套的循环来计算每个数的最少完全平方数的个数,外层循环从1到n,内层循环从0到99,对于每个数i,内层循环遍历nums数组中的完全平方数,在内层循环中,我们检查当前数i减去一个完全平方数nums[j]后是否大于等于0,如果是则说明可以将nums[j]加入到i中,得到一个更小的数并更新dp[i]为dp[i-nums[j]]+1和dp[i]中的较小值, 最后我们将dp[n]返回出去即可

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

坚持努力,无惧未来!