搜索四联通区域:
方法一:之前是这么写的:
记录每个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); } };