DFS/BFS/UN - LC200 Number of Islands

深度優(yōu)先搜索(Depth First Search,DFS)

主要思想:不撞南墻不回頭

深度優(yōu)先遍歷的主要思想就是:首先以一個(gè)未被訪問過的頂點(diǎn)作為起始頂點(diǎn),沿當(dāng)前頂點(diǎn)的邊走到未訪問過的頂點(diǎn);當(dāng)沒有未訪問過的頂點(diǎn)時(shí),則回到上一個(gè)頂點(diǎn),繼續(xù)試探訪問別的頂點(diǎn),直到所有的頂點(diǎn)都被訪問。

沿著某條路徑遍歷直到末端,然后回溯,再沿著另一條進(jìn)行同樣的遍歷,直到所有的頂點(diǎn)都被訪問過為止。

這道題時(shí)間和空間O(m*n)

class Solution {
    public int numIslands(char[][] grid) {
        if(grid.length == 0) return 0;
        int m = grid.length, n = grid[0].length, res = 0;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if (grid[i][j] != '1' ) continue;
                ++res;
                dfs(grid, i, j, m-1, n-1);
            }
        }
        return res;
    }
      
    public void dfs(char[][] grid, int i, int j, int m, int n) {  
        if (i < 0 || i > m || j < 0 || j > n || grid[i][j] != '1') return;
        grid[i][j] = '2'; //表示已經(jīng)走過 
        dfs(grid, i - 1, j, m, n); //up 
        dfs(grid, i + 1, j, m, n);  //down
        dfs(grid, i, j - 1, m, n);  //left
        dfs(grid, i, j + 1, m, n);  //right
    } 
}

廣度優(yōu)先搜索(Breadth First Search, BFS)

主要思想:層層遞進(jìn)

首先以一個(gè)未被訪問過的頂點(diǎn)作為起始頂點(diǎn),訪問其所有相鄰的頂點(diǎn),然后對每個(gè)相鄰的頂點(diǎn)再訪問它們相鄰的未被訪問過的頂點(diǎn),直到所有頂點(diǎn)都被訪問過,遍歷結(jié)束

public class Solution {
    public int numIslands(char[][] grid) {
        if(grid.length == 0) return 0;
        int m = grid.length, n = grid[0].length, res = 0;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if (grid[i][j] == '1' ) {
                    LinkedList<Point> queue = new LinkedList<Point>();
                    visited(grid, i, j, queue);
                    ++res;
                    bfs(grid, queue, m, n);
                }
                
            }
        }
        return res;
    }
      
    private void bfs(char[][] grid, LinkedList<Point> queue, int m, int n){
        while(!queue.isEmpty()) {  
            Point point = queue.poll();
            int code = point.x - 1;
            if(code >= 0 && grid[code][point.y] == '1') visited(grid, code, point.y, queue);//up
            code = point.x + 1;
            if(code < m && grid[code][point.y] == '1') visited(grid, code, point.y, queue);//down
            code = point.y - 1;
            if(code >= 0 && grid[point.x][code] == '1') visited(grid, point.x, code, queue);//left
            code = point.y + 1;
            if(code < n && grid[point.x][code] == '1') visited(grid, point.x, code, queue);//right
            
        } 
    }
    
    private void visited(char[][] grid, int i, int j, LinkedList<Point> queue){
        Point point = new Point(i, j);
        queue.offer(point);  
        grid[i][j] = '2'; //mark visited 
    }
    
    public class Point{
        int x;
        int y;
        public Point(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
    
}

union-find 方法

UN參考例子
我還需要總結(jié)一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 圖是一種比線性表和樹更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在圖中,結(jié)點(diǎn)之間的關(guān)系是任意的,任意兩個(gè)數(shù)據(jù)元素之間都可能相關(guān)。圖是一種多對...
    Alent閱讀 2,422評論 1 22
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 6,004評論 0 19
  • 關(guān)鍵詞:尋路 ** 1.深度優(yōu)先搜索(Depth-First-Search):**沿著樹的深度遍歷樹的節(jié)點(diǎn),盡可...
    ferrint閱讀 857評論 0 0
  • 算法一:快速排序算法 快速排序是由東尼·霍爾所發(fā)展的一種排序算法。在平均狀況下,排序 n 個(gè)項(xiàng)目要Ο(n log ...
    莫小奈閱讀 2,283評論 0 22
  • 親愛的領(lǐng)導(dǎo): 我不知道你還記不記得有這么一會(huì)事,在世茂旁邊的公交車站,我不知道那天怎么惹到了你,你說讓我寫檢討書,...
    55c96f98e667閱讀 366評論 0 0

友情鏈接更多精彩內(nèi)容