代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题

这篇具有很好参考价值的文章主要介绍了代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

130. 被围绕的区域

**题目:**给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
题目链接:130. 被围绕的区域
解题思路:在飞地的基础上做改动,使用一个栈存储需要改变的节点

class Solution {
    public int[][] move={{0,1},{0,-1},{1,0},{-1,0}};
    public boolean[][] visited;
    public boolean flag;
    public void solve(char[][] board) {
        //多一个栈记录要被改变的区域
        visited=new boolean[board.length][board[0].length];
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                if(!visited[i][j]&&board[i][j]=='O'){
                    flag=false;
                    Queue<int[]> needToChange = new LinkedList<>();
                    bfs(board,i,j,needToChange);
                    if(flag==true){
                        needToChange.clear();
                    }else{
                        while(!needToChange.isEmpty()){
                            int[] node=needToChange.poll();
                            board[node[0]][node[1]]='X';
                        }
                    }                        
                }
            }
        }
    }
    public void bfs(char[][] board,int x,int y,Queue<int[]> needToChange){
        if(x==0||x==board.length-1||y==0||y==board[0].length-1){
            flag=true;
        }
        Queue<int[]> queue=new LinkedList<>();
        queue.offer(new int[]{x,y});
        needToChange.offer(new int[]{x,y});
        visited[x][y]=true;
        while(!queue.isEmpty()){
            int[] node=queue.poll();
            for(int p=0;p<4;p++){
            int nextx=node[0]+move[p][0];
            int nexty=node[1]+move[p][1];
            if(nextx<0||nextx>=board.length||nexty<0||nexty>=board[0].length){
                continue;
            }
            if(!visited[nextx][nexty]&&board[nextx][nexty]=='O'){
                if(nextx==0||nextx==board.length-1||nexty==0||nexty==board[0].length-1)       {
                    flag=true;
                }
                queue.offer(new int[]{nextx,nexty});
                needToChange.offer(new int[]{nextx,nexty});
                visited[nextx][nexty]=true;
            }
            }
        }
    }
}

417. 太平洋大西洋水流问题

题目:有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题,代码随想录,图论
输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]]
输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]
示例 2:
输入: heights = [[2,1],[1,2]]
输出: [[0,0],[0,1],[1,0],[1,1]]
题目链接:417. 太平洋大西洋水流问题
**解题思路:**找到哪些点 可以同时到达太平洋和大西洋。 流动的方式只能从高往低流。从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而长,将遍历过的节点也标记上。 然后两方都标记过的节点就是既可以流太平洋也可以流大西洋的节点。
代码如下:文章来源地址https://www.toymoban.com/news/detail-756646.html

class Solution {
    private static final int[][] position = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

    /**
     * 循环遍历超时时可以将需要遍历搜索的点加入队列再进行遍历搜索
     */
    public void bfs(int[][] heights, Queue<int[]> queue, boolean[][][] visited) {
        while (!queue.isEmpty()) {
            int[] curPos = queue.poll();
            for (int[] current: position) {
                int row = curPos[0] + current[0], col = curPos[1] + current[1], sign = curPos[2];
                // 越界
                if (row < 0 || row >= heights.length || col < 0 || col >= heights[0].length) continue;
                // 高度不合适或者已经被访问过了
                if (heights[row][col] < heights[curPos[0]][curPos[1]] || visited[row][col][sign]) continue;
                visited[row][col][sign] = true;
                queue.add(new int[]{row, col, sign});
            }
        }
    }

    public List<List<Integer>> pacificAtlantic(int[][] heights) {
        int rowSize = heights.length, colSize = heights[0].length;
        List<List<Integer>> ans = new ArrayList<>();
        boolean[][][] visited = new boolean[rowSize][colSize][2];
        // 队列,保存的数据为 [行号, 列号, 标记]
        // 假设太平洋的标记为 1,大西洋为 0
        Queue<int[]> queue = new ArrayDeque<>();
        for (int row = 0; row < rowSize; row++) {
            visited[row][colSize - 1][0] = true;
            visited[row][0][1] = true;
            queue.add(new int[]{row, colSize - 1, 0});
            queue.add(new int[]{row, 0, 1});
        }
        for (int col = 0; col < colSize; col++) {
            visited[rowSize - 1][col][0] = true;
            visited[0][col][1] = true;
            queue.add(new int[]{rowSize - 1, col, 0});
            queue.add(new int[]{0, col, 1});
        }
        bfs(heights, queue, visited);
        for (int row = 0; row < rowSize; row++) {
            for (int col = 0; col < colSize; col++) {
                // 如果该位置即可以到太平洋又可以到大西洋,就放入答案数组
                if (visited[row][col][0] && visited[row][col][1])
                    ans.add(List.of(row, col));
            }
        }
        return ans;
    }
        
}

到了这里,关于代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛

    题目链接:被围绕的区域 步骤一:深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二:遍历地图,将’O’全部改成’X’,将’A’改回’O’ 题目链接:太平洋大西洋水流问题 思路:从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而

    2024年01月16日
    浏览(36)
  • 代码随想录 图论

    目录 797.所有可能得路径  200.岛屿数量 695.岛屿的最大面积 1020.飞地的数量  130.被围绕的区域  417.太平洋大西洋水流问题  827.最大人工岛 127.单词接龙  841.钥匙和房间 463.岛屿的周长  797. 所有可能的路径 中等 给你一个有  n  个节点的  有向无环图(DAG) ,请你找出所有从

    2024年04月10日
    浏览(31)
  • 代码随想录(番外)图论1

    1. 深度优先搜索理论基础 2. 所有可能的路径 3. 广度优先搜索理论基础.md https://programmercarl.com/%E5%9B%BE%E8%AE%BA%E6%B7%B1%E6%90%9C%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1. 深度优先搜索理论基础 总结 同理回溯算法,换汤不换药 二叉树递归讲解 (opens new window)中,给出了递归三部曲。 回溯算

    2024年04月28日
    浏览(27)
  • 代码随想录(番外)图论4

    417. 太平洋大西洋水流问题 那么我们可以 反过来想,从太平洋边上的节点 逆流而上,将遍历过的节点都标记上。 从大西洋的边上节点 逆流而长,将遍历过的节点也标记上。 然后两方都标记过的节点就是既可以流太平洋也可以流大西洋的节点。 也就是说通过从两边的大洋开

    2024年04月29日
    浏览(42)
  • 代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量

    代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量 一、797.所有可能的路径 题目链接:https://leetcode.cn/problems/all-paths-from-source-to-target/ 思路:求从0到n-1的所有路径,终止条件是当前节点为n-1。本题图的结构是group[][],group[x]表示x节点所能到达的所有节点的集合,深度

    2024年02月08日
    浏览(35)
  • 代码随想录图论并查集 第七天 | 685.冗余连接II

    代码随想录图论并查集 第七天 | 685.冗余连接II 一、685.冗余连接II 题目链接:https://leetcode.cn/problems/redundant-connection-ii/ 思路:684.冗余连接中是连通且无环的无向图可直接使用并查集模板,如果想判断集合中是否有环,且那条边构成环,只需要每次加入并查集之前先判断一下是

    2024年02月06日
    浏览(37)
  • 代码随想录图论 第五天| 841.钥匙和房间 463. 岛屿的周长

    代码随想录图论 第五天| 841.钥匙和房间 一、 841.钥匙和房间 题目链接:https://leetcode.cn/problems/keys-and-rooms/ 思路:钥匙就是索引,遍历过就标记,每拿到一个房间的钥匙,直接for循环递归遍历,深度优先直接拿下。 二、463. 岛屿的周长 题目链接:https://leetcode.cn/problems/island-

    2024年02月06日
    浏览(29)
  • 代码随想录图论 第二天 | 695. 岛屿的最大面积 1020. 飞地的数量

    代码随想录图论 第二天 | 695. 岛屿的最大面积 1020. 飞地的数量 一、695. 岛屿的最大面积 题目链接:https://leetcode.cn/problems/max-area-of-island/ 思路:典型的遍历模板题,我采用深度优先,每块岛屿递归遍历的时候计数,递归完比较大小记录最大值。 二、1020. 飞地的数量 题目链接

    2024年02月07日
    浏览(37)
  • 代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

    #查并集理论知识   并查集用处:解决连通性问题 将两个元素添加到一个集合中。 判断两个元素在不在同一个集合 思路:将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起,如何连通:只需要用一个一维数组来表示,即:father[A] = B,fathe

    2024年02月16日
    浏览(31)
  • [代码随想录]二叉树

    二叉树可以链式存储,也可以顺序存储。 那么链式存储方式就用指针, 顺序存储的方式就是用数组。 顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。 链式存储如图: 链式存储是大家很熟悉的一种方式,那么

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包