1. 程式人生 > 實用技巧 >BFS——279. 完全平方數

BFS——279. 完全平方數

給定正整數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; } }

需要好好的理解一下!