279. 完全平方数

你的名字 2022-11-25 00:58 286阅读 0赞

题目:

279. 完全平方数
在这里插入图片描述

题解:

1. 题解一:数学运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 题解二:动态规划

在这里插入图片描述
在这里插入图片描述

  1. n = 12
  2. 先把 n 减去一个平方数,然后求剩下的数分解成平方数和所需的最小个数
  3. n 减去 1, 然后求出 11 分解成平方数和所需的最小个数,记做 n1
  4. 那么当前方案总共需要 n1 + 1 个平方数
  5. n 减去 4, 然后求出 8 分解成平方数和所需的最小个数,记做 n2
  6. 那么当前方案总共需要 n2 + 1 个平方数
  7. n 减去 9, 然后求出 3 分解成平方数和所需的最小个数,记做 n3
  8. 那么当前方案总共需要 n3 + 1 个平方数
  9. 下一个平方数是 16, 大于 12, 不能再分了。
  10. 接下来我们只需要从 (n1 + 1), (n2 + 1), (n3 + 1) 三种方案中选择最小的个数,
  11. 此时就是 12 分解成平方数和所需的最小个数了
  12. 至于求 1183 分解成最小平方数和所需的最小个数继续用上边的方法去求
  13. 直到如果求 0 分解成最小平方数的和的个数, 返回 0 即可

代码:

1. 代码一:数学运算

  1. import java.util.*;
  2. public class code279 {
  3. // 判断是否是[完全]平方数
  4. public static boolean isSquare(int n)
  5. {
  6. int sqrt = (int) Math.sqrt(n);
  7. return sqrt * sqrt == n;
  8. }
  9. public static int numSquares(int n)
  10. {
  11. // 判断答案是否是 1
  12. if(isSquare(n))
  13. {
  14. return 1;
  15. }
  16. // 判断答案是否是 4
  17. int temp = n;
  18. while(temp % 4 == 0)
  19. {
  20. temp /= 4;
  21. }
  22. if(temp % 8 == 7)
  23. {
  24. return 4;
  25. }
  26. // 判断答案是否是 2
  27. for(int i = 1; i * i <= n; i++)
  28. {
  29. if(isSquare(n - i * i))
  30. {
  31. return 2;
  32. }
  33. }
  34. // 以上情况都排除的话,答案就是 3
  35. return 3;
  36. }
  37. public static void main(String[] args) {
  38. Scanner sc = new Scanner(System.in);
  39. while(sc.hasNextInt())
  40. {
  41. int n = sc.nextInt();
  42. int res = numSquares(n);
  43. System.out.println(res);
  44. }
  45. }
  46. }

2. 代码二:动态规划

  1. import java.util.*;
  2. public class code279 {
  3. // 方法2:动态规划
  4. public static int numSquares(int n) {
  5. // dp[i]表示 i 最少可以由几个[完全]平方数构成
  6. int dp[] = new int[n + 1]; // 默认初始化值都为0
  7. dp[0] = 0;
  8. for(int i = 1; i <= n; i++)
  9. {
  10. dp[i] = i; // 最坏的情况就是每次+1
  11. }
  12. // 依次求出 1, 2... 直到 n 的解
  13. for(int i = 1; i <= n; i++)
  14. {
  15. // 依次减去一个[完全]平方数
  16. for(int j = 1; j * j <= i; j++)
  17. {
  18. dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程
  19. }
  20. }
  21. return dp[n];
  22. }
  23. public static void main(String[] args) {
  24. Scanner sc = new Scanner(System.in);
  25. while(sc.hasNextInt())
  26. {
  27. int n = sc.nextInt();
  28. int res = numSquares(n);
  29. System.out.println(res);
  30. }
  31. }
  32. }

参考:

  1. 详细通俗的思路分析,多解法
  2. 完全平方数
  3. 画解算法:279. 完全平方数
  4. python3最基础的BFS套路代码,适合入门新手!
  5. 【超直白】【靠嘴讲】小学生都能看懂的题解,还看不懂我打你~
  6. 动态规划+BFS 逐行解释 python3
  7. 不只是答案,而是动态规划类题的思考过程
  8. Java 解法:将问题转化为图论

附:

递归、记忆化搜索、动态规划之间的联系:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 279. 完全平方

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 给你一个整数 n ,返回和为 n