[关闭]
@LIUHUAN 2020-06-28T09:44:51.000000Z 字数 1705 阅读 889

完美平方数从递归到迭代

algorithm


完美平方数

方法一:递归

  1. int numSquares(int n) { return dfs(n); }
  2. int dfs(int n) {
  3. if (n <= 0) {
  4. return 0;
  5. }
  6. if (n == 1) {
  7. return 1;
  8. }
  9. int x = sqrt(n);// 最大的枚举值,最小的从1开始
  10. int c = INT_MAX;
  11. for (int i = 1; i <= x; i++) {
  12. auto y = dfs(n - i * i);
  13. c = min(c, y + 1);
  14. }
  15. return c;
  16. }

方法二:转化为备忘录递归

  1. int numSquares(int n) { return dfs(n); }
  2. int dfs(int n) {
  3. if (n <= 0) {
  4. return 0;
  5. }
  6. if (n == 1) {
  7. return 1;
  8. }
  9. if (cache.find(n) != cache.end()) {// 已计算
  10. return cache[n];
  11. }
  12. int x = sqrt(n);
  13. int c = INT_MAX;
  14. for (int i = 1; i <= x; i++) {
  15. auto y = dfs(n - i * i);
  16. c = min(c, y + 1);
  17. }
  18. cache[n] = c;//缓存结果
  19. return c;
  20. }

方法三:完美平方数(转化为迭代计算)

  1. int numSquares(int n) { return dyp(n); }
  2. int dyp(int n) {
  3. if (n <= 0)
  4. return 0;
  5. if (n == 1) {
  6. return 1;
  7. }
  8. vector<int> dp(n + 1, INT_MAX);
  9. dp[1] = 1;
  10. dp[0] = 0;
  11. for (int i = 2; i <= n; i++) {
  12. for (int j = sqrt(i); j >= 1; j--) {
  13. dp[i] = min(dp[i], dp[i - j * j] + 1);
  14. }
  15. }
  16. return dp[n];
  17. }

其他

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注