返回轨道
算法 · 2026-05-14 · 32 阅读

P153 最少完全平方数分解

算法 32 阅读

信号摘要

难度:Medium · 时长:10:18 · leetcode 279 · lintcode 513

P153 最少完全平方数分解

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个正整数 n,你要计算出它最少可以分解成多少个完全平方数的和。完全平方数指的是可以表示成某个整数的平方的数字,比如 1、4、9、16 等等。

比如说,给你的 n 等于 5。5 最少可以表示成 1 和 4 这两个完全平方数相加:

5 = 1 + 4

因此 5 最少可以分解成 2 个完全平方数的和。

再比如说,给你的 n 等于 12。它最少可以分解成 4 + 4 + 4:

12 = 4 + 4 + 4

因此 12 最少可以分解成 3 个完全平方数的和。

代码

public class AlgoCasts {

  // Time: O(n ^ 3/2), Space: O(n)
  public int numSquaresDP(int n) {
    int[] d = new int[n+1];
    d[0] = 0;
    for (int i = 1; i <= n; ++i) {
      d[i] = i;
      for (int j = 1; j*j <= i; ++j)
        d[i] = Math.min(d[i], d[i - j*j] + 1);
    }
    return d[n];
  }

  // Math.sqrt 时间复杂度是 O(1)
  // 参考链接:https://stackoverflow.com/questions/35524072/worst-case-time-complexity-of-math-sqrt-in-java
  private boolean isSquare(int n) {
    int a = (int) Math.sqrt(n);
    return a*a == n;
  }

  // Time: O(n ^ 1/2), Space: O(1)
  public int numSquaresMath(int n) {
    if (isSquare(n)) return 1;
    for (int i = 1; i*i <= n; ++i)
      if (isSquare(n - i*i))
        return 2;
    while (n % 4 == 0) n /= 4;
    if (n % 8 != 7) return 3;
    return 4;
  }

}

📡 通讯频道