再論力扣第279題 完全平方數

2022-06-16 11:42:11 字數 1596 閱讀 7001

題目

給定正整數 n,找到若干個完全平方數(比如1, 4, 9, 16, ...)使得它們的和等於n。你需要讓組成和的完全平方數的個數最少。

示例1:

輸入: n = 12輸出: 3解釋: 12 = 4 + 4 + 4.

示例2

輸入: n = 13輸出: 2解釋: 13 = 4 + 9.

分析:

之前曾做過一次這道題,當時是剛學了動態規劃演算法,然後正好拿這個題進行練習,通過定義乙個狀態轉移陣列,也順利的解決了,但是經過力扣的測試,執行效率十分地的感人,執行時間長達上前毫秒,可見用動態規劃演算法實現的程式的效能並不怎麼好。正好最近在溫習了廣度優先演算法,那麼這個題也正好可以通過bfs解決,所以就再研究一下咯。並且沒想到,雖然程式寫的更為複雜了,但是執行時間大大的縮減了,甚至優於百分之九十以上的人的程式。好吧,廢話不多說,開始進行正式的分析。

我們知道,任何乙個正整數都可以由若干個完全平方數相加而得到,最簡單的就是數值是幾,就由多少個1相加,這是組成和的完全平方數最為多的情況。而題目中要求的是最少的情況,其實可以抽象為求最短路徑。也就是說,將n設定為起點,目的地是0,而n每一次向0靠近的時候,可以向前走的距離是1~n之間的所有平方數,比如:

n = 13   目的地:0 ,設定乙個計數值用於記錄遍歷的層數,到達0時的計數值就是最終的結果;

從13出發,作為bfs遍歷的第一層,那麼此時向0靠近時,可以走的距離分別由1、4、9,那麼我們就都走一下試試;

分別按照這三個距離向前走,到達的點分別是12、9、4,此時這三個點算作bfs遍歷的第二層;

開啟遍歷第二層,計數值加1,獲取第二層的結點個數,分別向0靠近遍歷,可走的距離依舊是小於等於各自頂點值的所有平方數,遍歷完當前層的所有頂點之後,就得到了下一層的所有頂點;

繼續重複上述工作,到達目的地0時,就立馬返回計數值。

注意必須遍歷完一層的頂點之後才能開始下一層,開啟一層計數值就+1

**:

public

int numsquares(int

n) list

squares =generatesquare(n);

linkedlist

queue = new linkedlist<>();

boolean isvisited = new

boolean[n + 1];

isvisited[n] = true

; queue.offer(n);

int count = 0;

while (!queue.isempty())

else

if (next < 0)

else

else}}

}}

return

count;

}private listgeneratesquare(int

n)

return

res;

}

再論力扣第279題 完全平方數

題目 給定正整數 n,找到若干個完全平方數 比如1,4,9,16,使得它們的和等於n。你需要讓組成和的完全平方數的個數最少。示例1 輸入 n 12 輸出 3 解釋 12 4 4 4.示例2 輸入 n 13 輸出 2 解釋 13 4 9.分析 之前曾做過一次這道題,當時是剛學了動態規劃演算法,然後正好...

(力扣)279 完全平方數

給出乙個數字n,它可以由若干個完全平方數相加得到。這道題目需要求出,所需要的完全平方數的最小數量。求最小的問題,可以用廣度優先搜尋演算法 bfs 求解。不難想出,這些完全平方數肯定比n要小。因此,我新建乙個陣列,稱為完全平方陣列,來儲存所有比n小的完全平方數。當然,如果在這個過程中,發現n本身就是完...

有效的完全平方數(力扣第367題)

題目 給定乙個正整數 num,編寫乙個函式,如果 num 是乙個完全平方數,則返回 true,否則返回 false。說明 不要使用任何內建的庫函式,如 sqrt。分析 這個題是乙個簡單題,通過迴圈能夠很容易的做出來,但是如果只用簡單的迴圈去判斷是否是完全平方數會超出時間限制,也就是說這樣的方式效能太...