Leetcode 1020. 飞地的数量(深度搜索)

这道题是上周竞赛的题目,当时被弄懵了,因为之前我并不会这些算法,接触算法也就两个多月,实属弟弟,现在再看,其实很简单。

给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地)。

移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。

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

示例 1:

输入:[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:
有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
示例 2:

输入:[[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:
所有 1 都在边界上或可以到达边界。

解法:

1.一个深度搜索,之后一个遍历
2.找到所有第一排和最后一排的 陆地,将其相连的陆地置为 2

class Solution {
    public int numEnclaves(int[][] A) {
        int row=A.length;
        int col=A[0].length;
        for(int j=0;j<col;j++){
            if(A[0][j]==1) dfs(0,j,A);         
        }
         for(int j=0;j<col;j++){
            if (A[row- 1][j] == 1)  dfs(row- 1, j, A);            
        }
         for(int i=0;i<row;i++){
            if(A[i][0]==1)  dfs(i,0,A);            
        }
        for(int i=0;i<row;i++){
            if(A[i][col - 1] == 1) dfs(i,col-1,A);            
        }
  
        int count = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (A[i][j] == 1)  count++;               
            }
        }
        return count;
    }

    int[][] next = {//建立边际循环体系
            {1, 0}, {-1, 0}, {0, 1}, {0, -1}
    };

    private void dfs(int i, int j, int[][] a) {
        a[i][j] = 2;
        for (int k = 0; k < 4; k++) {//在边际中循环,如果任何一边出现相邻,则继续进入dfs循环
            int nextI = i + next[k][0];
            int nextJ = j + next[k][1];
            if (nextI >= 0 && nextJ >= 0 && nextJ < a[0].length && nextI < a.length && a[nextI][nextJ] == 1) {
                dfs(nextI, nextJ, a);
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容