Leetcode 279. 完全平方数

墨蓝 2023-02-14 03:06 110阅读 0赞

Leetcode 279. 完全平方数

  • 1、问题分析
  • 2、问题解决
  • 3、总结

1、问题分析

题目链接:https://leetcode-cn.com/problems/perfect-squares/
  本质上就是一个动态规划问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。

2、问题解决

  笔者以C++方式解决。

  1. #include "iostream"
  2. using namespace std;
  3. #include "algorithm"
  4. #include "vector"
  5. #include "queue"
  6. #include "set"
  7. #include "map"
  8. #include "string"
  9. #include "stack"
  10. class Solution {
  11. // 定义 i 最少可以用多少个完全平方数表示,即个数数组
  12. // 例如: dp[10] 代表 10 最少可以用多少个完全平方数表示
  13. vector<int> dp;
  14. // 定义完全平方数数组,存储 i*i<=n 的所有数
  15. // 例如 n == 10, square={1,2,3}
  16. vector<int> square;
  17. public:
  18. int numSquares(int n) {
  19. // 边界处理
  20. if (n == 1) {
  21. return 1;
  22. }
  23. if (n == 2) {
  24. return 2;
  25. }
  26. // 初始化个数数组
  27. dp.resize(n);
  28. // 初始化完全平方数数组
  29. for (int i = 1; i < n; ++i) {
  30. if (i * i <= n) {
  31. square.push_back(i);
  32. }
  33. else {
  34. break;
  35. }
  36. }
  37. return dealChen(n);
  38. }
  39. /** * 计算 n 最少可以由多少个完全平方数组成 * @param n * @return */
  40. int dealChen(int n) {
  41. // 递归边界,这里仍然要注意不要溢出
  42. if (n < 0) {
  43. return INT_MAX / 100;
  44. }
  45. // 0 说明不需要完全平方数,直接返回 0
  46. if (n == 0) {
  47. return 0;
  48. }
  49. // 如果值已经计算过,则直接返回
  50. if (dp[n-1] != 0) {
  51. return dp[n-1];
  52. }
  53. int number_chen = INT_MAX/2;
  54. // 遍历完全平方数数组
  55. // 状态转移方程为 :
  56. // dp[n] = dp[n-i*i] + 1
  57. for (int i = square.size() - 1; i >= 0; --i) {
  58. // 选择其中最小的一个
  59. number_chen = min(number_chen, dealChen(n - square[i] * square[i]) + 1);
  60. }
  61. // 存储 最少可以由多少个完全平方数组成
  62. dp[n-1] = number_chen;
  63. // 返回计算结果
  64. return dp[n-1];
  65. }
  66. };
  67. int main() {
  68. Solution *pSolution = new Solution;
  69. int i = pSolution->numSquares(13);
  70. cout << i << endl;
  71. system("pause");
  72. return 0;
  73. }

运行结果

在这里插入图片描述

有点菜,有时间再优化一下。

3、总结

  难得有时间刷一波LeetCode, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!

发表评论

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

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

相关阅读

    相关 leetcode279 完全平方

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n = 12

    相关 279. 完全平方

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