Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...
) which sum to n.
Example 1:
Input: n =12
Output: 3 Explanation:12 = 4 + 4 + 4.
Example 2:
Input: n =13
Output: 2 Explanation:13 = 4 + 9.
这是一个标签为动态规划的题,不过我目前用的方法是bfs。
思路上来讲首先建立一个所有小于n的平方数的列表,比如n=12,sqnums=[1,4,9]
然后用12分别减去sqnums,结果保存在temp中,也就是[11,8,3],此时计数器+1
然后继续用广度优先遍历,用[11,8,3]这些已经减去一次平方数的数字,再减一次平方数,也就是[11-1,11-4,11-9,8-1,8-4,3-1](小于零会跳过。
这样不断遍历,遇到第一个0的时候就是最优解。
class Solution:
def numSquares(self, n: int) -> int:
sqnums=[]
sqnum=1
while sqnum*sqnum<=n:
sqnums.append(sqnum*sqnum)
sqnum+=1
result={n}
final=0
while result:
final += 1
temp=set()
for res in result:
for sq in sqnums:
if res==sq:
return final
if res<sq:
break
temp.add(res-sq)
result = temp
return final