279. Perfect Squares
Given an integer n, return the least number of perfect square numbers that sum to n.
A perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself. For example, 1, 4, 9, and 16 are perfect squares while 3 and 11 are not.
Example 1:
Input: n = 12
Output: 3
Explanation: 12 = 4 + 4 + 4.
Example 2:
Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.
Constraints:
- 1 < = n < = 1 0 4 1 <= n <= 10^4 1<=n<=104
From: LeetCode
Link: 279. Perfect Squares
Solution:
Ideas:
- Initialize an array dp with size n+1 and fill it with INT_MAX to represent infinity, since we are looking for the minimum value. This array will store the least number of perfect squares that sum to every number up to n.
- Set dp[0] = 0 because there are 0 perfect squares that sum to 0.
- Use nested loops to populate the dp array. The outer loop iterates through each number from 1 to n, and the inner loop iterates through each square number jj that could be used to form i. It updates dp[i] to the minimum between its current value and dp[i - jj] + 1.
- After filling the dp array, dp[n] contains the least number of perfect squares that sum to n.
Code:
c
int numSquares(int n) {
int dp[n+1];
for(int i = 0; i <= n; i++) {
dp[i] = INT_MAX;
}
dp[0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j*j <= i; j++) {
if(dp[i - j*j] != INT_MAX) {
dp[i] = dp[i] < dp[i - j*j] + 1 ? dp[i] : dp[i - j*j] + 1;
}
}
}
return dp[n];
}