题目链接:https://leetcode.com/problems/swim-in-rising-water/

题意:已知一个n*n的网格,初始时的位置为(0,0),目标位置为(n-1,n-1),且在t时刻,只有当网格中的值小于等于t时才能移动到该网格,且移动时只有上下左右四个方向。输出到网格(n-1,n-1)的最短时间。

思路:dfs一下即可,记录一个dp数组,表示到该网格的最小时间,开始时每个网格都设为无穷大,每次更新时间t为当前格子的值与上一时间的较大值。当周围网格的最小时间比当前网格大时则继续搜索。这样保证了网格值大的都能被搜到,且t小的不再搜索

class Solution {
public:
//四个方向
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0}; void dfs(int x,int y,int t,vector<vector<int> > &grid,vector<vector<int> > &dp){
dp[x][y]=max(t,grid[x][y]);
for(int i=0;i<4;i++){
int x0=x+dx[i],y0=y+dy[i];
if(x0<dp.size()&&x0>=0&&y0<dp.size()&&y0>=0){
if(dp[x0][y0]<=dp[x][y]){ //如果下一个网格的最短时间比当前网格小,则不搜索
continue;
}
dfs(x0,y0,dp[x][y],grid,dp);
}
}
} int swimInWater(vector<vector<int>>& grid) {
vector<vector<int> > dp(grid.size(),vector<int>(grid.size(),1e9));
//初始时t为第一个网格的值
dfs(0,0,grid[0][0],grid,dp);
return dp[grid.size()-1][grid.size()-1];
} };

上述算法复杂度较高,可以通过优先队列优化,优先队列中存储每个网格的信息,按照网格值较小优先。从初始网格开始,每次将队列头的网格弹出,并标记(每个网格访问一次)。并对其周围四个网格中未访问的入队。在此过程中,不断更新t的大小,取$t=max(t,grid[x][y])$。直到目标网格。

class Solution {
public:
struct P{
int x,y,z;
//按照grid[x][y]从小到大排列
bool operator <(const P& t)const {
return z>t.z;
}
};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int swimInWater(vector<vector<int>>& grid) {
//记录是否遍历过
vector<vector<bool> > vis(grid.size(),vector<bool>(grid.size(),0));
priority_queue<P> q;
P a;
a.x=0,a.y=0,a.z=0;
vis[0][0]=1;
q.push(a); //起始网格
int t=grid[0][0];
while(!q.empty()){
a= q.top();q.pop();
vis[a.x][a.y]=1;
if(a.x==grid.size()-1&&a.y==grid.size()-1) //到达目标网格,退出
return max(t,grid[a.x][a.y]);
if(a.z>t) //更新t
t=a.z;
for(int i=0;i<4;i++){ //将周围未访问的网格入队
int x0=a.x+dx[i],y0=a.y+dy[i];
if(x0<grid.size()&&x0>=0&&y0<grid.size()&&y0>=0&&vis[x0][y0]==0){
P b;
vis[x0][y0]=1;
b.x=x0,b.y=y0,b.z=grid[x0][y0];
q.push(b);
}
}
}
return 0;
}
};

  

LeetCode 778. Swim in Rising Water的更多相关文章

  1. 【LeetCode】778. Swim in Rising Water 水位上升的泳池中游泳(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/swim-in- ...

  2. 【leetcode】778. Swim in Rising Water

    题目如下: 解题思路:本题题干中提到了一个非常重要的前提:"You can swim infinite distance in zero time",同时也给了一个干扰条件,那就是 ...

  3. 778. Swim in Rising Water

    ▶ 给定方阵 grid,其元素的值为 D0n-1,代表网格中该点处的高度.现在网格中开始积水,时刻 t 的时候所有值不大于 t 的格点被水淹没,当两个相邻格点(上下左右四个方向)的值都不超过 t 的时 ...

  4. [LeetCode] Swim in Rising Water 在上升的水中游泳

    On an N x N grid, each square grid[i][j] represents the elevation at that point (i,j). Now rain star ...

  5. [Swift]LeetCode778. 水位上升的泳池中游泳 | Swim in Rising Water

    On an N x N grid, each square grid[i][j]represents the elevation at that point (i,j). Now rain start ...

  6. 【一天一道LeetCode】#42. Trapping Rain Water

    一天一道LeetCode系列 (一)题目 Given n non-negative integers representing an elevation map where the width of ...

  7. 如何装最多的水? — leetcode 11. Container With Most Water

    炎炎夏日,还是呆在空调房里切切题吧. Container With Most Water,题意其实有点噱头,简化下就是,给一个数组,恩,就叫 height 吧,从中任选两项 i 和 j(i <= ...

  8. leetcode problem 42 -- Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  9. [Leetcode][Python]42: Trapping Rain Water

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...

随机推荐

  1. Wide & Deep的OneFlow网络训练

    Wide & Deep的OneFlow网络训练 HugeCTR是英伟达提供的一种高效的GPU框架,专为点击率(CTR)估计训练而设计. OneFlow对标HugeCTR搭建了Wide & ...

  2. 混合前端seq2seq模型部署

    混合前端seq2seq模型部署 本文介绍,如何将seq2seq模型转换为PyTorch可用的前端混合Torch脚本.要转换的模型来自于聊天机器人教程Chatbot tutorial. 1.混合前端 在 ...

  3. java数据提交时问题

    form 表单中的action有参数时,当method为get时,servlet无法获取该参数 ajax提交数据,servlet无法进行请求转发和重定向. ${pageContext.request. ...

  4. GitHub标星125k!阿里技术官用3个月总结出的24万字Java面试笔记

    最近收到一位粉丝的回馈! 这位粉丝已经成功入职阿里了小编很是羡慕啊! 今天就把这份30w字Java面试笔记给大家分享出来,说来也巧这份资料也是由一位阿里技术官整理出来的这算不算是"搬起石头砸 ...

  5. 一、DNS服务器的搭建

    一.介绍 DNS服务:域名解析   将域名解析ip地址 DNS服务器的功能– 正向解析:根据注册的域名查找其对应的IP地址– 反向解析:根据IP地址查找对应的注册域名,不常用 所有完整的域名都要以点结 ...

  6. 『心善渊』Selenium3.0基础 — 1、Selenium自动化测试框架介绍

    目录 1.Selenium介绍 2.Selenium的特点 3.Selenium版本说明 4.拓展:WebDriver与Selenium RC的区别 5.Webdriver工作原理 1.Seleniu ...

  7. 2.docker下centos镜像

    1.下载并运行 # 交互模式下载并运行centos容器 $ docker run -it centos:latest /bin/bash 1.1 配置centos的环境别名 $ vi /etc/bas ...

  8. 《手把手教你》系列基础篇之(一)-java+ selenium自动化测试-环境搭建(上)(详细教程)

    1.简介 jmeter系列的文章结束,本来想趁热打铁顺别将Jmeter和接口测试介绍一下,但是感觉Jmeter时间太长了怕大家吃腻了,还有一个原因就是许多小伙伴们或者童鞋们私信问宏哥什么时候可以有ja ...

  9. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历

    摘要:华为云数据库GaussDB(for Cassandra) 是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库:它依靠共享存储池实现了强一致,保证数据的安全可靠. 本文 ...

  10. 《吃透微服务》 - 服务容错之Sentinel

    大家好,我是小菜. 一个希望能够成为 吹着牛X谈架构 的男人!如果你也想成为我想成为的人,不然点个关注做个伴,让小菜不再孤单! 本文主要介绍 SpringCloud中Sentinel 如有需要,可以参 ...