Leetcode 279 完全平方數

2021-10-04 05:25:11 字數 2150 閱讀 1714

演算法過程:

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...