演算法過程:
dp[i]表示i最少可以由幾個平方數構成。
1.初試化dp=[0
,1,2
,⋯,n],長度為n+
1,最多次數就是全由1構成。
2.遍歷dp,對於i,遍歷區間[
2,n+1):
遍歷所有平方數小於i的數j,遍歷區間[1,
int(sqrt(i))+
1):dp[i]
=min
(dp[i]
,dp[i-j*j]+1
)。始終儲存所有可能情況中的最小值。
3.返回dp[n]
def
numsquares
(n):
dp=[i for i in
range
(n+1)]
for i in
range(2
,n+1):
for j in
range(1
,int
(i**
(0.5))
+1):
dp[i]
=min
(dp[i]
,dp[i-j*j]+1
)return dp[-1
]
複雜度分析:
時間複雜度:o(n*sqrt(n))
空間複雜度:o(n)
借助佇列實現廣度優先遍歷(層次遍歷)
1.初始化佇列queue=
[n],訪問元組visited=
,初試化路徑長度step=02
.特判,若n==
0,返回0。
3.迴圈條件,佇列不為空:
step+=
1,因為迴圈一次,意味著一層中的節點已經遍歷完,所以路徑長度需要加一。
定義當前層中的節點數l=
len(queue),遍歷當前層的所有節點:
令tmp為隊首元素。
遍歷所有可能數ii的平方數,遍歷區間[1,
int(sqrt(tmp))+
1): 定義x=tmp-i**
2 若==
0,返回當前的路徑長度。
若x not
in visited,表示當前節點未出現過:將該節點入隊並在訪問陣列中加入。
4.返回step
def
numsquares
(n):
from collections import deque
if n ==0:
return
0 queue = deque(
[n])
step =
0 visited =
set(
)while
(queue)
: step+=
1 l=
len(queue)
for _ in
range
(l):
tmp=queue.pop(
)for i in
range(1
,int
(tmp**
0.5)+1
):x=tmp-i**2if
(x==0)
:return step
if(x not
in visited)
: visited.add(x)
return step
def
numsquares3
(n):
while n %4==
0:n/=
4if n %8==
0:return
4
a =0while a**
2<= n:
b =int(
(n - a**2)
**0.5
)if a**
2+ b**
2== n:
return
bool
(a)+
bool
(b) a +=
1return
3
Leetcode 279 完全平方數
給定正整數 n,找到若干個完全平方數 比如1,4,9,16,使得它們的和等於n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12輸出 3解釋 12 4 4 4.示例 2 輸入 n 13輸出 2解釋 13 4 9.解題思路 比較容易想到的方法是bfs 廣度優先搜尋 如果知道四平方和的話就...
LeetCode 279 完全平方數
題目描述 提示幫助 提交記錄社群討論閱讀解答 隨機一題 給定正整數 n,找到若干個完全平方數 比如1,4,9,16,使得它們的和等於n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12輸出 3解釋 12 4 4 4.示例 2 輸入 n 13輸出 2解釋 13 4 9.class sol...
Leetcode279 完全平方數
給定正整數 n,找到若干個完全平方數 比如 1,4,9,16,使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。示例 1 輸入 n 12 輸出 3 解釋 12 4 4 4.示例 2 輸入 n 13 輸出 2 解釋 13 4 9.解法1 bfs public intnumsquares in...