ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode1020飞地的数量-----深度优先搜索

2022-04-19 20:34:24  阅读:180  来源: 互联网

标签:陆地 Leetcode1020 单元格 网格 飞地 int ----- visited grid


题目表述

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

示例:

深度优先搜索

该题思路和岛屿数量比较相似,根据飞地的定义,如果从一个陆地单元格出发无法移动到网格边界,则这个陆地单元格是飞地。因此可以将所有陆地单元格分成两类:第一类陆地单元格和网格边界相连,这些陆地单元格不是飞地;第二类陆地单元格不和网格边界相连,这些陆地单元格是飞地。

我们可以从网格边界上的每个陆地单元格开始深度优先搜索,遍历完边界之后,所有和网格边界相连的陆地单元格就都被访问过了。然后遍历整个网格,如果网格中的一个陆地单元格没有被访问过,则该陆地单元格不和网格的边界相连,是飞地。

在实现时,不用将整个二维数组全部遍历,只用遍历网格的边界即可,找边界值为1的坐标,dfs搜索与该边界连通的值即可。

class Solution {
    private int[][] directions = {{1,0},{-1,0},{0,-1},{0,1}};
    public int numEnclaves(int[][] grid) {
        int count = 0;
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] visited = new boolean[grid.length][grid[0].length]; 
        for(int i = 0;i < m; i++){
            dfs(i,0,visited,grid);
            dfs(i,n-1,visited,grid);
        }
        for(int i = 1; i < n-1;i++){
            dfs(0,i,visited,grid);
            dfs(m-1,i,visited,grid);
        }
        for(int i = 0; i < m;i++){
            for(int j = 0; j < n; j++){
                if(grid[i][j] == 1 && !visited[i][j]){
                    count++;
                }
            }
        }
        return count;
    }
    public void dfs(int row, int col, boolean[][] visited, int[][] grid){
         if(row < 0 || row >= grid.length || col < 0 || col >= grid[0].length){
            return;
        }
        if(visited[row][col] == true){
            return;
        }
        if(grid[row][col] == 0){
            return ;
        }

        visited[row][col] = true;
        for(int[] dir:directions){
            dfs(row+dir[0], col + dir[1], visited, grid);
        }
    }
}

标签:陆地,Leetcode1020,单元格,网格,飞地,int,-----,visited,grid
来源: https://www.cnblogs.com/youngerwb/p/16167170.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有