Perfect Squares — Coin Change with Squares

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem

Given n, return the least number of perfect square numbers that sum to n.


Solutions

Python — DP

class Solution:
    def numSquares(self, n: int) -> int:
        dp=[float('inf')]*(n+1); dp[0]=0
        i=1
        while i*i<=n:
            for j in range(i*i,n+1):
                dp[j]=min(dp[j],dp[j-i*i]+1)
            i+=1
        return dp[n]

Python — BFS (layered)

from collections import deque
class Solution:
    def numSquares(self, n: int) -> int:
        squares=[i*i for i in range(1,int(n**0.5)+1)]
        q=deque([n]); visited={n}; level=0
        while q:
            level+=1
            for _ in range(len(q)):
                rem=q.popleft()
                for sq in squares:
                    nxt=rem-sq
                    if nxt==0: return level
                    if nxt>0 and nxt not in visited: visited.add(nxt); q.append(nxt)
        return level

C++

class Solution {
public:
    int numSquares(int n){
        vector<int> dp(n+1,INT_MAX); dp[0]=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j*j<=i;j++) dp[i]=min(dp[i],dp[i-j*j]+1);
        return dp[n];
    }
};

Complexity

  • Time: O(n * sqrt(n)) | Space: O(n)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro