Leetcode 岛屿问题 200, 1905, 694重新做,其他的想思路

200. Number of Islands

1.dfs

cpp 复制代码
class Solution {
private:
    void dfs(vector<vector<char>>& grid, int i, int j){
        int m = grid.size(), n = grid[0].size();
        if(i<0 || j<0 || i>=m || j>=n) return;
        if(grid[i][j] == '0') return;
        grid[i][j] = '0';
        dfs(grid, i-1,j);
        dfs(grid, i+1, j);
        dfs(grid, i, j-1);
        dfs(grid, i, j+1);
    }
public:
    int numIslands(vector<vector<char>>& grid) {
        int res = 0;
        int m = grid.size(), n = grid[0].size();
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == '1'){
                    res++;
                    dfs(grid, i, j);
                }
            }
        }

        return res;
    }
};

这里把岛屿淹类似于维护了visited, 确保不会重复计算岛屿,dfs的作用是把一整块岛屿都淹没了,当遍历到岛屿的其中一块时, 会向外淹没,直到这个岛屿都被淹没

1254. Number of Closed Islands

cpp 复制代码
class Solution {
private:
    void dfs(vector<vector<int>>& grid, int i, int j){
        int m = grid.size(), n = grid[0].size();
        if(i<0 || j<0 || i>=m || j>=n) return;
        if(grid[i][j] == 1) return;
        grid[i][j] = 1;
        dfs(grid, i-1, j);
        dfs(grid, i+1, j);
        dfs(grid, i, j-1);
        dfs(grid, i, j+1);
    }
public:
    int closedIsland(vector<vector<int>>& grid) {
        int res = 0;
        int m = grid.size(), n = grid[0].size();
        for(int i=0; i<m; i++){
            dfs(grid, i, 0);
            dfs(grid, i, n-1);
        }
        for(int j=0; j<n; j++){
            dfs(grid, 0, j);
            dfs(grid, m-1, j);
        }

        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == 0){
                    res++;
                    dfs(grid, i, j);
                }
            }
        }
        return res;
    }
};

去除掉四边的岛屿就可以

1020. Number of Enclaves

cpp 复制代码
class Solution {
private:
    void dfs(vector<vector<int>>& grid, int i, int j){
        int m = grid.size();
        int n = grid[0].size();
        if(i<0 || j<0 || i>=m || j>=n) return;
        if(grid[i][j] == 0) return;
        grid[i][j] = 0;
        dfs(grid, i-1, j);
        dfs(grid, i+1, j);
        dfs(grid, i, j-1);
        dfs(grid, i, j+1);
    }
public:
    int numEnclaves(vector<vector<int>>& grid) {
        int move = 0; 
        int m = grid.size();
        int n = grid[0].size();
        for(int i=0; i<m; i++){
            dfs(grid, i, 0);
            dfs(grid, i, n-1);
        }
        for(int j=0; j<n; j++){
            dfs(grid, 0,j);
            dfs(grid, m-1, j);
        }
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == 1)
                    move++;
            }
        }
        return move;
    }
};

和上一题很像,这里就不需要把中间的岛屿淹没了,只要求1的数量就可以了

695. Max Area of Island

cpp 复制代码
class Solution {
private:
    int dfs(vector<vector<int>>& grid, int i, int j){
        int m = grid.size(), n = grid[0].size();
        if(i<0 || j<0 || i>=m || j>=n) return 0;
        if(grid[i][j] == 0) return 0;
        grid[i][j] = 0;
        return dfs(grid, i-1, j) + dfs(grid, i+1, j) + dfs(grid, i, j-1) + dfs(grid, i, j+1) +1;
    }
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int maxArea = 0;
        int m = grid.size(), n = grid[0].size();
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == 1) 
                    maxArea = max(maxArea, dfs(grid, i, j));
            }
        }
        return maxArea;
    }
};

1905. Count Sub Islands

cpp 复制代码
class Solution {
private:
    void dfs(vector<vector<int>>& grid, int i, int j){
        int m = grid.size(), n = grid[0].size();
        if(i<0 || j<0 || i>=m || j>=n){
            return;
        }
        if(grid[i][j] == 0) return;
        grid[i][j] = 0;
        dfs(grid, i-1, j);
        dfs(grid, i+1, j);
        dfs(grid, i, j-1);
        dfs(grid, i, j+1);
    }
public:
    int countSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) {
        int m = grid1.size(), n = grid1[0].size();
        int res = 0;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid1[i][j] == 0 && grid2[i][j] == 1){
                    dfs(grid2, i, j);
                }
            }
        }
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid2[i][j] == 1){
                    res++;
                    dfs(grid2, i, j);
                }
            }
        }  
        return res;
           
    }
};

重要的是想到是什么是子岛屿

694. Number of Distinct Islands

cpp 复制代码
class Solution {
private:
    void dfs(vector<vector<int>>& grid, int i, int j, string& s, int dir){
        int m = grid.size(), n = grid[0].size();
        if(i<0 || j<0 || i>=m || j>=n) return;
        if(grid[i][j] == 0) return;
        grid[i][j] = 0;
        s += to_string(dir) + ',';
        dfs(grid, i-1, j, s, 1);
        dfs(grid, i+1, j, s, 2);
        dfs(grid, i, j-1, s, 3);
        dfs(grid, i, j+1, s, 4);
        s += to_string(-dir) + ',';

    }
public:
    int numDistinctIslands(vector<vector<int>>& grid) {
        unordered_set<string> record;
        int m = grid.size(), n = grid[0].size();
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == 1){
                    string curIsland = "";
                    dfs(grid, i, j, curIsland, 666);
                    record.insert(curIsland);
                }
            }
        }
        return record.size();
    }
};

需要用一个set记录岛屿的形状

这里也要记录撤销的值

相关推荐
彦为君22 分钟前
算法思维与经典智力题
java·前端·redis·算法
智能优化与强化学习32 分钟前
Gym(Gymnasium)仿真环境详解(二):环境简介、入门算法、调参要点、核心挑战
算法·强化学习·gym·零基础入门·算法评估
mxwin43 分钟前
Unity Shader exp 函数的算法与渲染应用
算法·unity·游戏引擎·shader
“码”力全开1 小时前
AI视频分析误报优化完整流程
算法·架构·边缘计算
深盾科技_Virbox1 小时前
深盾科技·Virbox产品体系全景解读:软件安全如何从加密锁走向全生命周期
java·大数据·算法·安全·软件需求
可编程芯片开发1 小时前
基于VSG虚拟同步发电机控制的三相并网逆变器带多组可变负载Simulink建模与仿真
算法
AI服务老曹2 小时前
国产NPU视觉算法参数配置说明
算法·性能优化·边缘计算
彦为君2 小时前
Redis最新版本特性
java·数据库·redis·算法·bootstrap
触底反弹2 小时前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
aaaameliaaa3 小时前
计算斐波那契数(递归、迭代)(1,1,2,3,5.....)
c语言·开发语言·笔记·算法·排序算法