1. Recursive Branching
Intuition
Recursively try subtracting every perfect square j * j <= rem and take the minimum count.
Algorithm
- Define
solve(rem). - If
rem == 0, return 0. - Initialize
minCount = inf. - For
j = 1whilej * j <= rem: -
minCount = min(minCount, 1 + solve(rem - j * j)). - Return
minCount.
#include <iostream>#include <algorithm> using namespace std; class Solution { int solve(int n) { if (n == 0) return 0; int minCount = 1e9; for (int j = 1; j * j <= n; ++j) { minCount = min(minCount, 1 + solve(n - j * j)); } return minCount; }public: int numSquares(int n) { return solve(n); }}; int main() { Solution sol; cout << "Num Squares: " << sol.numSquares(12) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(sqrt(n)^n) - Space complexity:
O(n) call stack