LeetCode417. Pacific Atlantic Water Flow

文章目录

一、题目

There is an m x n rectangular island that borders both the Pacific Ocean and Atlantic Ocean. The Pacific Ocean touches the island's left and top edges, and the Atlantic Ocean touches the island's right and bottom edges.

The island is partitioned into a grid of square cells. You are given an m x n integer matrix heights where heightsrc represents the height above sea level of the cell at coordinate (r, c).

The island receives a lot of rain, and the rain water can flow to neighboring cells directly north, south, east, and west if the neighboring cell's height is less than or equal to the current cell's height. Water can flow from any cell adjacent to an ocean into the ocean.

Return a 2D list of grid coordinates result where resulti = ri, ci denotes that rain water can flow from cell (ri, ci) to both the Pacific and Atlantic oceans.

Example 1:

Input: 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]

Output: \[0,4,1,3,1,4,2,2,3,0,3,1,4,0]

Explanation: The following cells can flow to the Pacific and Atlantic oceans, as shown below:

0,4: 0,4 -> Pacific Ocean

0,4 -> Atlantic Ocean

1,3: 1,3 -> 0,3 -> Pacific Ocean

1,3 -> 1,4 -> Atlantic Ocean

1,4: 1,4 -> 1,3 -> 0,3 -> Pacific Ocean

1,4 -> Atlantic Ocean

2,2: 2,2 -> 1,2 -> 0,2 -> Pacific Ocean

2,2 -> 2,3 -> 2,4 -> Atlantic Ocean

3,0: 3,0 -> Pacific Ocean

3,0 -> 4,0 -> Atlantic Ocean

3,1: 3,1 -> 3,0 -> Pacific Ocean

3,1 -> 4,1 -> Atlantic Ocean

4,0: 4,0 -> Pacific Ocean

4,0 -> Atlantic Ocean

Note that there are other possible paths for these cells to flow to the Pacific and Atlantic oceans.

Example 2:

Input: heights = \[1]

Output: \[0,0]

Explanation: The water can flow from the only cell to the Pacific and Atlantic oceans.

Constraints:

m == heights.length

n == heightsr.length

1 <= m, n <= 200

0 <= heightsrc <= 105

二、题解

cpp 复制代码
class Solution {
public:
    int dirs[4][2] = {1,0,0,1,-1,0,0,-1};
    void dfs(vector<vector<int>>& heights,vector<vector<bool>>& visited,int x,int y){
        visited[x][y] = true;
        for(int i = 0;i < 4;i++){
            int nextX = x + dirs[i][0];
            int nextY = y + dirs[i][1];
            if(nextX < 0 || nextX >= heights.size() || nextY < 0 || nextY >= heights[0].size()) continue;
            if(heights[nextX][nextY] >= heights[x][y] && !visited[nextX][nextY]){
                dfs(heights,visited,nextX,nextY);
            }
        }
    }
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        int m = heights.size(),n = heights[0].size();
        vector<vector<bool>> pacificVisited(m,vector<bool>(n,false));
        vector<vector<bool>> atlanticVisited(m,vector<bool>(n,false));
        //标记左右
        for(int i = 0;i < m;i++){
            dfs(heights,pacificVisited,i,0);
            dfs(heights,atlanticVisited,i,n-1);
        }
        //标记上下
        for(int j = 0;j < n;j++){
            dfs(heights,pacificVisited,0,j);
            dfs(heights,atlanticVisited,m-1,j);
        }
        vector<vector<int>> res;
        //统计结果
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(pacificVisited[i][j] && atlanticVisited[i][j]){
                    res.push_back({i,j});
                }
            }
        }
        return res;
    }
};
相关推荐
雨落在了我的手上3 分钟前
Java数据结构(十一):优先级队列(堆)
数据结构
大圣编蚕33 分钟前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界2 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光2 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
随意起个昵称2 小时前
【BFS】冰面滑行
算法·宽度优先
老赵的博客3 小时前
c++ QT之动态库加载问题
c++·qt
(Charon)3 小时前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
hansang_IR3 小时前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
这个DBA有点耶4 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康4 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题