Leetcode之廣度優先搜索(BFS)專題-279. 完全平方數(Perfect Squares)


Leetcode之廣度優先搜索(BFS)專題-279. 完全平方數(Perfect Squares)

BFS入門詳解:Leetcode之廣度優先搜索(BFS)專題-429. N叉樹的層序遍歷(N-ary Tree Level Order Traversal)


 

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

示例 1:

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

示例 2:

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


本題思路來自題解,把這個題,我們可以轉換為圖論來解決,下面給出一張圖,幫助理解,圖來自題解。

 

引入vis標記,已加入的數字就不再加入隊列計算,發現第一個結果為0的,就直接返回,因為他是最短的。

引入vis,是避免多余的計算,因為vis=1代表之前已經算過了,如果重復計算,路徑長度只會比之前的長,所以直接已經計算過的數字直接跳過。

可以對照着上面這張圖,自己嘗試寫出偽代碼,然后再把偽代碼轉換為代碼,幫助理解。

class Solution {
    private class Node {
        int val;
        int step;

        public Node(int val, int step) {
            this.val = val;
            this.step = step;
        }
    }

    public int numSquares(int n) {
        Queue<Node> queue = new LinkedList<>();
        int[] vis = new int[n+1];
        queue.offer(new Node(n,0));
        while(!queue.isEmpty()){
            Node temp = queue.poll();
            int num = temp.val;
            int step = temp.step;
            for (int i = 1;; i++) {
                int val = num - i*i;
                if(val<0){
                    break;
                }
                if(val==0){
                    return step+1;
                }
                if(vis[val]==0){
                    vis[val] = 1;
                    queue.offer(new Node(val,step+1));
                }
            }
        }
        return -1;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM