首页 > 其他分享 >LeetCode 417.太平洋大西洋水流问题

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

时间:2023-08-20 16:01:05浏览次数:34  
标签:int 单元格 heights length 417 result 大西洋 LeetCode 水流

1.题目:

https://leetcode.cn/problems/pacific-atlantic-water-flow/description/

有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。

这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。

岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。

返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。

 

示例 1:

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

输入: 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]]

2.代码:

dfs:

class Solution {
    int[][] move = {{1,0},{-1,0},{0,1},{0,-1}};
    boolean[][][] visited;
    public List<List<Integer>> pacificAtlantic(int[][] heights) {
        List<List<Integer>> result = new ArrayList<>();
        int rowSize = heights.length;
        int colSize = heights[0].length;
        visited = new boolean[rowSize][colSize][2];
        // 记录 [row, col] 位置是否可以到某条河,可以为 true,反之为 false;
        // 假设太平洋的标记为 1,大西洋为 0
        for(int i=0;i<rowSize;i++){
           visited[i][0][1]=true;//左-太平洋
           visited[i][colSize-1][0]=true;//右-大西洋
           dfs(heights,i,0,1);
           dfs(heights,i,colSize-1,0);
        }
        for(int j=0;j<colSize;j++){
            visited[0][j][1]=true;//上-太平洋
            visited[rowSize-1][j][0]=true;//下-大西洋
            dfs(heights,0,j,1);
            dfs(heights,rowSize-1,j,0);
        }
        for(int i=0;i<rowSize;i++){
            for(int j=0;j<colSize;j++){
                if(visited[i][j][0] && visited[i][j][1]){
                    // 如果该位置即可以到太平洋又可以到大西洋,就放入答案数组
                    result.add(List.of(i,j));
                }
            }
        }
        return result;
    }
    public void dfs(int[][] heights,int row,int col,int sign){
        for(int i=0;i<move.length;i++){
            int m = row+move[i][0];
            int n = col+move[i][1];
            if(m<0||n<0||m>=heights.length||n>=heights[0].length) continue;// 越界
            // 高度不合适或者已经被访问过了
            if(heights[m][n]<heights[row][col] || visited[m][n][sign]) continue;
            visited[m][n][sign]=true;
            dfs(heights,m,n,sign);
        }
    }
}

标签:int,单元格,heights,length,417,result,大西洋,LeetCode,水流
From: https://blog.51cto.com/u_15806469/7162246

相关文章

  • LeetCode -- 第 359 场周赛
    本题我们只需要将所有首字母取出来,并与s比较即可。classSolution{public:boolisAcronym(vector<string>&words,strings){stringres;for(auto&it:words){res+=it[0];}returnres==s;}};  ......
  • IDEA 刷题工具 leetcode editor
    突然有一天不好用了,然后抓取新的cookie后也登陆不上https://github.com/shuzijun/leetcode-editor/issues/402之前的IDEA版本太低了,不支持JCEF更新到最新的2023.2版本但是又有了新的问题,发现evalreset用不了了,会抛出异常最后选择升级到2020.2.4版本的IDEA,解......
  • 3.你所不知道的go语言控制语句——Leetcode习题69
    目录本篇前瞻Leetcode习题9题目描述代码编写控制结构顺序结构(Sequence)声明和赋值多返回值赋值运算符算术运算符位运算符逻辑运算分支结构if语句switch语句逻辑表达式fallthrough类型推断循环语句continuebreakgotoLeetcode习题69题目描述题目分析代码编写本篇小结下篇预告本篇......
  • LeetCode
    字符串左旋转字符串剑指Offer58-II.左旋转字符串申请空间,取模运算classSolution{public:stringreverseLeftWords(strings,intn){stringans=s;for(inti=0;i!=s.size();++i){ans[(i-n+s.size())%s.size()]=s[i];......
  • leetcode: TC of top-down memorization
    exampletoexplainhowtocalculateTimeComplexitythememosizemeanseachstatewillbecalculatedonlyoncehowabouttheTCineachstate? classSolution{publicbooleanwordBreak(Strings,List<String>wordDict){returndfs(s,w......
  • #yyds干货盘点# LeetCode程序员面试金典:是子序列
    1.简述:给定字符串s 和t,判断 s 是否为 t 的子 序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,是的一个子序列,而不是)。"ace""abcde""aec"进阶:如果有大量输入的S,称作S1,S2,...,Sk其中k>=10亿,你需要依次......
  • #yyds干货盘点# LeetCode程序员面试金典:最大正方形
    题目:在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。 示例1:输入:matrix=[["1","0","1","0","0"],["1","0","1","1","1"],["1&qu......
  • leetcode2235 两整数相加
    题目描述:(这第一种方法我就不多说了,肯定是有手就行)给你两个整数num1和num2,返回这两个整数的和。示例1:输入:num1=12,num2=5输出:17解释:num1是12,num2是5,它们的和是12+5=17,因此返回17。示例2:输入:num1=-10,num2=4输出:-6解释:num1+num2=-6,因此返......
  • Leetcode 146 LRUCache
    /***Copyright(C)2023-08-1813:51zxinlog<[email protected]>**/#include<func.h>#defineN1000//普通NodetypedefstructNode{intkey;intvalue;structNode*prev;structNode*next;}Node;//定义HashNodetyped......
  • LeetCode 1020.飞地的数量
    1.题目:给你一个大小为 mxn 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数......