image.png

思路

跟322.零钱兑换一样的思路
都是求最小个数
这道题我的想法是先把完全平方数数组给求出来了,浪费了空间
大佬是直接在循环里判断掉了

  1. var numSquares = function(n) {
  2. let nums =[]
  3. for(let i=1;i<=n;i++){
  4. if(i*i<=n){
  5. nums[i-1] =i*i
  6. }else{
  7. break
  8. }
  9. }
  10. let dp= new Array(n+1).fill(Infinity)
  11. dp[0] =0
  12. for(let i=0;i<nums.length;i++){
  13. for(let j=nums[i];j<=n;j++){
  14. dp[j] =Math.min(dp[j-nums[i]]+1,dp[j])
  15. }
  16. }
  17. return dp[n]
  18. };
  19. // 循环判断
  20. var numSquares1 = function(n) {
  21. let dp = new Array(n + 1).fill(Infinity)
  22. dp[0] = 0
  23. for(let i = 1; i**2 <= n; i++) {
  24. let val = i**2
  25. for(let j = val; j <= n; j++) {
  26. dp[j] = Math.min(dp[j], dp[j - val] + 1)
  27. }
  28. }
  29. return dp[n]