Perfect Squares
Question
Given a positive integer n, find the least number of perfect square numbers (for example, 1
, 4
, 9
, 16
, ...) which sum to n.
For example, given n = 12
, return 3
because 12 = 4 + 4 + 4
; given n = 13
, return 2
because 13 = 4 + 9
.
Tags
- Dynamic Programming
- BFS
- Math
Thought
Use the dynamic Programing and the recurrence equation is DP[i + j * j] = min(DP[i + j * j], DP[i] + 1)
.
DP[i]
represents the lead number of perfect squares to form the positive integer i
.
Code
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
dp = [0] * (n + 1)
for i in xrange(1, len(dp)):
dp[i] = sys.maxint
for i in xrange(n + 1):
j = 1
while i + j * j <= n:
dp[i + j * j] = min(dp[i + j * j], dp[i] + 1)
j += 1
return dp[-1]