BFS——279. 完全平方數
阿新 • • 發佈:2020-07-20
給定正整數n,找到若干個完全平方數(比如1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
示例1:
輸入: n = 12 輸出: 3 解釋: 12 = 4 + 4 + 4.
示例 2:
輸入: n = 13 輸出: 2 解釋: 13 = 4 + 9.
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/perfect-squares
思路:
這道題的解題辦法有很多,既然先給他歸類到了BFS類,就先用BFS的思路來解題。(動態規劃中還要再做一次)
遍歷完第一層再遍歷第二層再第三層。。。
那麼第二層,第三層分別是什麼東西,怎麼來的呢?
再此之前我們要先得到一個集合,用來儲存給定的n之前的所有的平方數
以13為例,那麼13前面的平方數就有{1 ,4 ,9}
那麼第二層的內容就是第一個13 - 1 = 12;第二個 13 - 4 = 9; 13 - 9 = 4;
當觀察到的第二個和第三個,減去平方數的差值,他還是一個平方數,13 - 4 = 9,9就是一個平方數
那麼好,這就說明找到了,那麼就返回他的層次level就行了。
這是官方的圖,我框起來的地方是有錯誤的應該是 7 - 4 = 3,官方失誤最為致命,知道就好了,噓~
找到step4才出現了第一個和小於7的平方數集合{1,4}中相同的數字:1
也就是說找到了第四層才發現,所以要返回leve = 4;那麼驗證一下,7 = 4 + 1 + 1 +1,四層,沒問題!
class Solution { public int numSquares(int n) { //第一步:定義一個動態陣列來儲存n之前的所有平方數 List<Integer> square_num = new ArrayList<>(); for (int i = 1; i * i <= n; i++) { square_num.add(i * i); } //第二步:定義一個動態陣列來存放當前的層次有哪些資料 //定義一個level來記錄層次List<Integer> queue = new ArrayList<Integer>(); int level = 0; queue.add(n); while (queue.size() > 0){ level ++; List<Integer> next_queue = new ArrayList<Integer>(); for (Integer a : queue){ for (Integer b : square_num){ if (a.equals(b)){ //說明這個數他就和平方數相同了,返回層數 return level; }else if (a <= b){ break; }else { next_queue.add(a - b); } } } queue = next_queue; } return level; } }
需要好好的理解一下!