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 heights[r][c] 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 result[i] = [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 == heights[r].length

1 <= m, n <= 200

0 <= heights[r][c] <= 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;
    }
};
相关推荐
智者知已应修善业34 分钟前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn36 分钟前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
hnjzsyjyj1 小时前
洛谷B3862:图的遍历(简单版)← 邻接表
dfs·邻接表
AI科技星2 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
云泽8082 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
科研前沿2 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨2 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
AI进化营-智能译站3 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
晨曦夜月3 小时前
map与unordered_map区别
算法·哈希算法