給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...)使得它們的和等于 n。你需要讓組成和的完全平方數的個數最少。
示例 1:
輸入: n = 12
輸出: 3
解釋: 12 = 4 + 4 + 4.
示例 2:
輸入: n = 13
輸出: 2
解釋: 13 = 4 + 9.
思路:
visited=[False(n)]:一組長度為n的False數組,用來記錄visited[i]是否已經被訪問。因為后面訪問到相同數值的話,step的長度肯定是大于之前的step。所以被訪問過一個數值i就把visited[i]置為True。
res[[n,step]]:記錄數值和其經過的step;
每次pop出res第一個數值,循環(huán)遍歷其完全平方數。
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
res = [];
res.append([n,0]);
visited = [False for _ in range(n+1)];
visited[n] = True;
while res:
tmp,step = res.pop(0);
i = 1;
muti = tmp - i*i;
while muti >= 0:
if muti == 0:
return step + 1;
if not visited[muti]:
res.append([muti,step+1]);
visited[muti] = True;
i += 1;
muti = tmp - i*i;