1. 程式人生 > >Leetcode: 200. Number of Islands (week4 --- medium)

Leetcode: 200. Number of Islands (week4 --- medium)

題目

示例

分析

題解

總結


題目

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

示例

分析

題目中的land可以是由很多個1所構成的,但是要求是這一塊所有的1所構成的整體周圍的其他元素均為0,也就是上下左右(視邊界為0)。而題目要求正是找出這些“大陸”的個數。

題解

這一道題是BFS的題目,所以首先是考慮BFS的演算法實現。而我們可以考慮在進行每個節點的遍歷的時候,首先判斷當前的節點是否為1,如果是1,則計數器加一,也就是對應的最後的返回值,然後判斷其對應的四個方位的元素是否為1,然後跟上面的方式一樣,將其位置的元素重置為0,但是計數器並不加一。因為當前屬於同一個區域。只有發現第一個為1的時候才會進行加一操作。

而置為零則是為了防止重複計算陸地的數目,同時也是為了好區分。

所以實現的程式碼如下:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        result = 0;
        int m = grid.size();    //row
        if( m == 0) return 0;
        int n = grid[0].size(); //col
        int array[m][n] = {0};
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(grid[i][j] == '1') {
                    result++;
                    dfs(grid, i, j);
                }  
            }
        } 
        return result;
    }
    void dfs(vector<vector<char>> &grid, int i, int j){
        grid[i][j] = '0';
        if(i > 0 && grid[i-1][j] == '1'){
            dfs(grid, i-1, j);
        }
        if(i < grid.size()-1 && grid[i+1][j] == '1'){
            dfs(grid, i+1, j);
        }
        if(j > 0 && grid[i][j-1] == '1'){
            dfs(grid, i, j-1);
        }
        if(j < grid[0].size()-1 && grid[i][j+1] == '1'){
            dfs(grid, i, j+1);
        }
    }
private:
    int result;
};

總結

  1. 根據老師上課講的題目:主要存在以下幾種題型
    1. 找出最小環
    2. 找出兩點之間的最小路徑以及路徑的數目
    3. 對樹的父子節點的公式更新規則
    4. 可以轉化為強聯通演算法的體型
    5. 將題目的多種可選擇操作作為分支的準則,從而能夠轉化為DFS或者NFS
    6. ...
  2. 覺得這一些演算法要多去理解,以及去解解題才能夠熟悉這些演算法的應用。