【Leetcode200】Number of Islands

搜索四聯通區域:

方法一:之前是這麼寫的:

 記錄每個region的root,最後根據真正的root的個數來判斷,這是純循環的方式,效率不是很高5%.

//class Solution {
//public:
//    int findRoot(vector<int> root, int region){
//        while(root[region] != region){
//            region = root[region];
//        }
//        return region;
//    }
//    int numIslands(vector<vector<char>>& grid) {
//        if(grid.empty()) return 0;
//        vector<vector<int>> regions(grid.size(), vector<int>(grid[0].size(), -1));
//        vector<int> root;
//        int region_id = 0;//新的id
//        size_t rows = grid.size();
//        size_t cols = grid[0].size();
//        if(grid[0][0] == '1'){
//            regions[0][0] = region_id;
//            root.push_back(region_id);
//            region_id++;
//        }else{
//
//        }
//        for(size_t col = 1; col < cols; col++){
//            if(grid[0][col] == '0') continue;
//            else{
//                if(regions[0][col-1] != -1){
//                    regions[0][col] = regions[0][col-1];
//                }else{
//                    regions[0][col] = region_id;
//                    root.push_back(region_id);
//                    region_id++;
//                }
//            }
//
//        }
//        for(size_t row = 1; row < rows; ++row){
//            if(grid[row][0] == '0') continue;
//            else{
//                if(regions[row-1][0] != -1){
//                    regions[row][0] = regions[row-1][0];
//                }else{
//                    regions[row][0] = region_id;
//                    root.push_back(region_id);
//                    region_id++;
//                }
//            }
//        }
//        for(size_t row = 1; row < rows; ++row){
//            for(size_t col = 1; col < cols; ++col){
//                if(grid[row][col] == '0') continue;
//                if(regions[row][col-1] != -1){
//                    if(regions[row-1][col] != -1){//左上都有
//                        int left = findRoot(root, regions[row][col-1]);
//                        int up = findRoot(root, regions[row-1][col]);
//                        if(left <= up){
//                            regions[row][col] = left;
//                            root[up] = left;
//                        }else{
//                            regions[row][col] = up;
//                            root[left] = up;
//                        }
//                    }else{
//                        regions[row][col] = regions[row][col-1];
//                    }
//                }else{
//                    if(regions[row-1][col] != -1){
//                        regions[row][col] = regions[row-1][col];
//                    }else{//左上都沒有
//                        regions[row][col] = region_id;
//                        root.push_back(region_id);
//                        region_id++;
//                    }
//                }
//            }
//        }
//        int count = 0;
//        for(size_t index = 0; index < root.size(); ++index){
//            if(root[index] == index)
//                count++;
//        }
//        for(size_t i = 0; i < regions.size(); i++){
//            for(size_t j = 0; j < regions[i].size(); ++j){
//                std::cout << regions[i][j] << " ";
//            }
//            std::cout << std::endl;
//        }
//        std::cout << std::endl;
//        for(auto p : root){
//            std::cout << p << " ";
//        }
//        std::cout << std::endl;
//        return count;
//    }
//};

方法二:

深度優先搜索:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int count = 0;
        if(grid.empty() || grid[0].empty()) return 0;
        vector<vector<bool>> visited(grid.size(), vector<bool>(grid[0].size(), false));
        for(size_t row = 0; row < grid.size(); ++row){
            for(size_t col = 0; col < grid[0].size(); ++col){
                if(grid[row][col] == '0' || visited[row][col])//如果不是island或者已經訪問過
                    continue;
                help(row, col, visited, grid);
                count++;
            }
        }
        return count;
    }
    void help(int i, int j, vector<vector<bool>>& visited, vector<vector<char>>& grid){
        if(i < 0 || i >= visited.size() || j < 0 || j >= visited[0].size() || grid[i][j] == '0' || visited[i][j]) return;
        visited[i][j] = true;
        help(i-1, j, visited, grid);
        help(i, j-1, visited, grid);
        help(i, j+1, visited, grid);
        help(i+1, j, visited, grid);
    }

};

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章