DEV Community

Sunbeom Kweon (Ben)
Sunbeom Kweon (Ben)

Posted on • Updated on

[Algorithms] 4 - Number of Islands

Link to the problem

1. Overview

  • The approach I used for this problem is Breadth First Search(BFS). Starting from one point, and scanning its up, down, left and right coordinates of the given 2D-array.

2. Struggles

  • The reason why I decided to write this post is that I found out that a tiny mistake can lead to an inefficient solution, when it comes to the solution using BFS. And I wanted to share this so that I don't make the same mistake during any interviews.

  • The code with my mistake would give the correct answer, but it will get "Time Limit Exceeded" error on Leetcode.

3. Codes

Main function

int numIslands(vector<vector<char>>& grid) {

        if(grid.size() == 0) return 0;

        int count = 0;
        for (int i = 0; i < grid.size(); i++){
            for (int j = 0; j < grid[0].size(); j++){
                if(grid[i][j] == '0') {
                    continue;
                } else {
                    BFS(grid, i, j, count);
                }
            }
        }
        return count;
    }
Enter fullscreen mode Exit fullscreen mode

Wrong BFS function

void BFS(vector<vector<char>>& grid, int i, int j, int& count){
        vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
        queue<vector<int>> q;
        vector<int> start = {i, j};
        q.push(start);
        while(!q.empty()){
            vector<int> curr = q.front();
            grid[curr[0]][curr[1]] = '0'; 
            q.pop();
            for (auto v:dir){
                int newCol = curr[0] + v[0];
                int newRow = curr[1] + v[1];
                if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
                    continue;
                } else {
                    vector<int> nextPos = {newCol, newRow};
                    q.push(nextPos);
                }
            }
        }
        count++;
    }
Enter fullscreen mode Exit fullscreen mode

Correct BFS function

static void BFS(vector<vector<char>>& grid, int i, int j, int& count){
        vector<vector<int>> dir = {{-1,0}, {1,0}, {0,-1}, {0,1}};
        queue<vector<int>> q;
        vector<int> start = {i, j};
        q.push(start); 
        while(!q.empty()){
            vector<int> curr = q.front();
            q.pop();
            grid[curr[0]][curr[1]] = '0'; 
            for (auto v:dir){
                int newCol = curr[0] + v[0];
                int newRow = curr[1] + v[1];
                if (newCol < 0 || newRow < 0 || newCol >= grid.size() || newRow >= grid[0].size() || grid[newCol][newRow] == '0'){
                    continue;
                } else {
                    vector<int> nextPos = {newCol, newRow};
                    grid[curr[0]][curr[1]] = '0'; // <= Solution                  
                    q.push(nextPos);
                }
            }
        }
        count++;
    }
Enter fullscreen mode Exit fullscreen mode

4. Explanation

Did you see why the first function would cause an error? The reason is that I was not taking advantage of BFS. Since I was not turning '1' to '0' while I was scanning up, down, left and right coordinates, on the next loop, the queue will keep pushing those coordinates that I have already visited, Which will lead my program codes getting Time Limit Exceeded error, even though the answer is going to be the same.

Discussion (0)