problem
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.
solution
这个问题可以使用四平方和定理来求解,但是这个算法比较特殊、trick,所以这里主要介绍一下dp解法。
这个问题不需要自己定义子问题了,所以只关心递推方程即可, dp[i]=min(dp[i−j∗j]+1),for j∗j<=i ,这里的一个收获就是这个递推方程,我之前使用的是 dp[i]=min(dp[i−j]+dp[j]),for j<=i/2 ,所以在dp中只要能正确的将i降下来(因为所有数一定会分解成j*j + x,所以不会漏掉任何可能的情况),所需要的代价越小越好。前者用了O(log i),而后者用了O(i)的时间。
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
m = [float('inf')]*(n+1)
i = 1
while i*i <= n:
m[i*i] = 1
i += 1
for i in range(1, n+1):
if m[i] == float('inf'):
j = 1
while j*j <= i:
m[i] = min(m[i], m[j*j]+m[i-j*j])
j +=1
return m[n]