433.島嶼的個數(shù)

描述

給一個01矩陣,求不同的島嶼的個數(shù)烧给。
0代表海,1代表島喝噪,如果兩個1相鄰础嫡,那么這兩個1屬于同一個島。我們只考慮上下左右為相鄰酝惧。

樣例

在矩陣

[
  [1, 1, 0, 0, 0],
  [0, 1, 0, 0, 1],
  [0, 0, 0, 1, 1],
  [0, 0, 0, 0, 0],
  [0, 0, 0, 0, 1]
]

有3個島

代碼

  1. BFS
class Coordinate {
    int x, y;
    public Coordinate(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class Solution {
    /**
     * @param grid a boolean 2D matrix
     * @return an integer
     */
    public int numIslands(boolean[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0;
        }
        int m = grid.length;
        int n = grid[0].length;
        int islands = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j]) {
                // 當點是1時才執(zhí)行markedByBST,所以markedByBST算法具體實現(xiàn)時不需要再判斷grid[i][j]對應的布爾值
                    markedByBST(grid, i, j);
                    islands++;
                } 
            }
        }
        return islands;
    }
    
    // 用BFS尋找1點周圍四個點榴鼎,然后將找到的1點標記false
    private void markedByBST(boolean[][] grid, int x, int y) {
        int[] detalX = {0, 0, 1, -1};
        int[] detalY = {1, -1, 0, 0};
        Queue<Coordinate> queue = new LinkedList<>();
        queue.offer(new Coordinate(x, y));
        grid[x][y] = false;
        while (!queue.isEmpty()) {
            Coordinate coor = queue.poll();
            for (int i = 0; i < 4; i++) {
                Coordinate head = new Coordinate(coor.x + detalX[i], coor.y + detalY[i]);
                if (!inBound(grid, head.x, head.y)) {
                    continue;
                }
                if (grid[head.x][head.y]) {
                    grid[head.x][head.y] = false;
                    queue.offer(head);
                }
            }
        }
    }
    
    private boolean inBound(boolean[][] grid, int x, int y) {
        int m = grid.length;
        int n = grid[0].length;
        return x >= 0 && x < m && y >= 0 && y < n;
    }
}
  1. Union Find
class UnionFind { 

    private int[] father = null;
    private int count;

    private int find(int x) {
        if (father[x] == x) {
            return x;
        }
        return father[x] = find(father[x]);
    }

    public UnionFind(int n) {
        // initialize your data structure here.
        father = new int[n];
        for (int i = 0; i < n; ++i) {
            father[i] = i;
        }
    }

    public void connect(int a, int b) {
        int root_a = find(a);
        int root_b = find(b);
        if (root_a != root_b) {
            father[root_a] = root_b;
            count --;
        }
    }
        
    public int query() {
        return count;
    }
    
    public void set_count(int total) {
        count = total;
    }
}

public class Solution {
    /**
     * @param grid a boolean 2D matrix
     * @return an integer
     */
    public int numIslands(boolean[][] grid) {
        int count = 0;
        int n = grid.length;
        if (n == 0)
            return 0;
        int m = grid[0].length;
        if (m == 0)
            return 0;
        UnionFind union_find = new UnionFind(n * m);
        
        int total = 0;
        for(int i = 0;i < grid.length; ++i)
            for(int j = 0;j < grid[0].length; ++j)
            if (grid[i][j])
                total ++;
    
        union_find.set_count(total);
        for(int i = 0;i < grid.length; ++i)
            for(int j = 0;j < grid[0].length; ++j)
            if (grid[i][j]) {
                if (i > 0 && grid[i - 1][j]) {
                    union_find.connect(i * m + j, (i - 1) * m + j);
                }
                if (i <  n - 1 && grid[i + 1][j]) {
                    union_find.connect(i * m + j, (i + 1) * m + j);
                }
                if (j > 0 && grid[i][j - 1]) {
                    union_find.connect(i * m + j, i * m + j - 1);
                }
                if (j < m - 1 && grid[i][j + 1]) {
                    union_find.connect(i * m + j, i * m + j + 1);
                }
            }
        return union_find.query();
    }
}
  1. DFS (not recommended)
public class Solution {
    /**
     * @param grid a boolean 2D matrix
     * @return an integer
     */
    private int m, n;
    public void dfs(boolean[][] grid, int i, int j) {
        if (i < 0 || i >= m || j < 0 || j >= n) return;
        
        if (grid[i][j]) {
            grid[i][j] = false;
            dfs(grid, i - 1, j);
            dfs(grid, i + 1, j);
            dfs(grid, i, j - 1);
            dfs(grid, i, j + 1);
        }
    }

    public int numIslands(boolean[][] grid) {
        // Write your code here
        m = grid.length;
        if (m == 0) return 0;
        n = grid[0].length;
        if (n == 0) return 0;
        
        int ans = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (!grid[i][j]) continue;
                ans++;
                dfs(grid, i, j);
            }
        }
        return ans;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晚唇,隨后出現(xiàn)的幾起案子巫财,更是在濱河造成了極大的恐慌,老刑警劉巖哩陕,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件平项,死亡現(xiàn)場離奇詭異,居然都是意外死亡悍及,警方通過查閱死者的電腦和手機闽瓢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來心赶,“玉大人扣讼,你說我怎么就攤上這事∮Ы校” “怎么了椭符?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵荔燎,是天一觀的道長。 經(jīng)常有香客問我销钝,道長湖雹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任曙搬,我火速辦了婚禮摔吏,結果婚禮上,老公的妹妹穿的比我還像新娘纵装。我一直安慰自己征讲,他們只是感情好,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布橡娄。 她就那樣靜靜地躺著诗箍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挽唉。 梳的紋絲不亂的頭發(fā)上滤祖,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音瓶籽,去河邊找鬼匠童。 笑死,一個胖子當著我的面吹牛塑顺,可吹牛的內(nèi)容都是我干的汤求。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼严拒,長吁一口氣:“原來是場噩夢啊……” “哼扬绪!你這毒婦竟也來了?” 一聲冷哼從身側響起裤唠,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤挤牛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后种蘸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓赴,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年劈彪,在試婚紗的時候發(fā)現(xiàn)自己被綠了竣蹦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡沧奴,死狀恐怖痘括,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤纲菌,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布挠日,位于F島的核電站,受9級特大地震影響翰舌,放射性物質發(fā)生泄漏嚣潜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一椅贱、第九天 我趴在偏房一處隱蔽的房頂上張望懂算。 院中可真熱鬧,春花似錦庇麦、人聲如沸计技。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垮媒。三九已至,卻和暖如春航棱,著一層夾襖步出監(jiān)牢的瞬間睡雇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工饮醇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留它抱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓驳阎,卻偏偏與公主長得像抗愁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呵晚,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容