leetcode 完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...
)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n =12
输出: 3 解释:12 = 4 + 4 + 4.
示例 2:
输入: n =13
输出: 2 解释:13 = 4 + 9.
from collections import deque
import math
class Solution:
def init(self, n):
l = []
for i in range(1, math.ceil(n ** 0.5)+1):
l.append(i**2)
return l
def numSquares(self, n: int) -> int:
l = self.init(n)
if n in l:
return 1
q = deque()
l.sort(reverse = True)
# print("L:",l)
tmp = []
for each in l:
q.append([each])
while 1:
# print("Q:",q)
for each in l:
if (each <= min(q[0])) and (each+sum(q[0]) <= n) :
tmp = q[0][:]
tmp.append(each)
q.append(tmp)
# print("q[-1]:",q[-1])
if sum(q[-1]) >= n:
return len(q[-1])
q.popleft()
return len(q[-1])
for num in range(1,600):
a = Solution()
print("num:",num," step: ",a.numSquares(num))
思路:
依旧用BFS,首先找到可能的完全平方数,从大到小排。将该列表入队,检查队首的下一层,即队首加上一个小于等于他自身的完全平方数的话,就入队,这里用列表来表示每一个节点,指导入队的列表各元素和等于目标值。
注意这里如果目标值自身就在开始的完全平方数列表里的话,直接返回1。