Perfect Squares

medium math dp bfs

Problem

Given an integer n, return the least number of perfect-square numbers (1, 4, 9, 16, …) that sum to n.

Inputn = 12
Output3
12 = 4 + 4 + 4.

def num_squares(n):
    dp = [0] + [float('inf')] * n
    for i in range(1, n + 1):
        k = 1
        while k * k <= i:
            dp[i] = min(dp[i], dp[i - k * k] + 1)
            k += 1
    return dp[n]
function numSquares(n) {
  const dp = new Array(n + 1).fill(Infinity);
  dp[0] = 0;
  for (let i = 1; i <= n; i++) {
    for (let k = 1; k * k <= i; k++) {
      dp[i] = Math.min(dp[i], dp[i - k * k] + 1);
    }
  }
  return dp[n];
}
class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for (int i = 1; i <= n; i++)
            for (int k = 1; k * k <= i; k++)
                dp[i] = Math.min(dp[i], dp[i - k * k] + 1);
        return dp[n];
    }
}
int numSquares(int n) {
    vector<int> dp(n + 1, INT_MAX);
    dp[0] = 0;
    for (int i = 1; i <= n; i++)
        for (int k = 1; k * k <= i; k++)
            dp[i] = min(dp[i], dp[i - k * k] + 1);
    return dp[n];
}
Time: O(n · √n) Space: O(n)