iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0

今天的題目給出一個用文字表示的圖形,當中 1 表示陸地,0 表示海水。相鄰的 1 (上下相鄰或左右相鄰都算)會組成一大塊島嶼,我們要找出的是,題目中共有幾座不相鄰的島嶼。

這個題目用肉眼看很好解,但演算法就稍微複雜。本題的做法是用 DFS 搜索,當找到陸地時,就會偵測他的上下左右還有沒有陸地,如果發現陸地,便打上記號,並繼續搜尋這塊陸地的四周,直到再也找不到為止,然後進入下一個點繼續搜尋。這樣一來,相鄰的陸地會在第一次就被找到並且做上標記,當第二次找到時,會知道已經來過了,因此不會重複計算。

明天沒有意外的話,預計會繼續寫這種類型的題目,可以的話會試著比較 DFS 和 BFS 的不同。今天這題其實有看了 BFS 的解法,但我覺得概念和 DFS 太像難以分辨差別,所以就不附上了QQ


https://ithelp.ithome.com.tw/upload/images/20200917/20129662J5wpsBj3rl.png

// javascript
// DFS
var numIslands = function(grid) {
    if (!grid || grid.length == 0) return 0;
    const row = grid.length
    const col = grid[0].length;
    let num = 0;
    
    var dfs = function(i, j) {
        if (i < 0 || i >= row || j < 0 || j >= col || grid[i][j] === '0') return;
        grid[i][j] = '0';
        dfs(i - 1, j);
        dfs(i + 1, j);
        dfs(i, j - 1);
        dfs(i, j + 1);
    }
    
    for (var i = 0; i < row; i++) {
        for (var j = 0; j < col; j++) {
            if (grid[i][j] === '1') {
                num++;
                dfs(i, j);
            }
        }
    }
    
    return num;
};

上一篇
[Day 9] Longest Substring Without Repeating Characters:簡單講點 two pointer
下一篇
[Day 11] Binary Tree Level Order Traversal:二元樹與 BFS
系列文
天天 LeetCode,立地成佛:三十天從頭開始學演算法12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言