2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时,在时间为 t 时,水池中的水位为 t 。
2022-10-05:在一个 n x n 的整数矩阵 grid 中,
每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。
当开始下雨时,在时间为 t 时,水池中的水位为 t 。
你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。
假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。
当然,在你游泳的时候你必须待在坐标方格里面。
你从坐标方格的左上平台 (0,0) 出发。
返回 你到达坐标方格的右下平台 (n-1, n-1) 所需的最少时间 。
输入: grid = [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]。
输出: 16。
答案2022-10-05:
Dijkstra 算法。
时间复杂度:O(N2*logN)。
空间复杂度:O(N2)。
代码用rust编写。代码如下:
use std::iter::repeat;
fn main() {
let mut grid = vec![
vec![0, 1, 2, 3, 4],
vec![24, 23, 22, 21, 5],
vec![12, 13, 14, 15, 16],
vec![11, 17, 18, 19, 20],
vec![10, 9, 8, 7, 6],
];
let ans = swim_in_water2(&mut grid);
println!("ans = {}", ans);
}
// Dijkstra算法
fn swim_in_water2(grid: &mut Vec<Vec<i32>>) -> i32 {
let n = grid.len() as i32;
let m = grid[0].len() as i32;
let mut heap: Vec<Vec<i32>> = Vec::new();
let mut visited: Vec<Vec<bool>> = repeat(repeat(false).take(m as usize).collect())
.take(n as usize)
.collect();
heap.push(vec![0, 0, grid[0][0]]);
let mut ans = 0;
while heap.len() > 0 {
heap.sort_by(|a, b| a[2].cmp(&b[2]));
let r = heap[0][0];
let c = heap[0][1];
let v = heap[0][2];
heap.remove(0);
if visited[r as usize][c as usize] {
continue;
}
visited[r as usize][c as usize] = true;
if r == n - 1 && c == m - 1 {
ans = v;
break;
}
add(grid, &mut heap, &mut visited, r - 1, c, v);
add(grid, &mut heap, &mut visited, r + 1, c, v);
add(grid, &mut heap, &mut visited, r, c - 1, v);
add(grid, &mut heap, &mut visited, r, c + 1, v);
}
return ans;
}
fn add(
grid: &mut Vec<Vec<i32>>,
heap: &mut Vec<Vec<i32>>,
visited: &mut Vec<Vec<bool>>,
r: i32,
c: i32,
pre_v: i32,
) {
if r >= 0
&& r < grid.len() as i32
&& c >= 0
&& c < grid[0].len() as i32
&& !visited[r as usize][c as usize]
{
heap.push(vec![
r,
c,
pre_v + get_max(0, grid[r as usize][c as usize] - pre_v),
]);
}
}
fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
}
执行结果如下:
2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时,在时间为 t 时,水池中的水位为 t 。的更多相关文章
- 解决loadrunner在脚本回放时长时间等待及在vugen中create controller scenario时报错的方法!超管用!!
解决loadrunner在脚本回放时长时间等待及在vugen中create controller scenario时报错的方法 经过咨询,有两种方法.经过实践,下面的方法1有效,方法2无效(我下载安装 ...
- jquery中修改一个元素的值或内容
jquery中修改一个元素的值或内容,比如数值增加可以使用这个方法取得原值并+1 $this.text(function(i,ot){return Number(ot)+1;});
- coalesce函数-返回参数中第一个非null值
coalesce函数-返回参数中第一个非null值 学习了:http://www.cnblogs.com/zc_0101/archive/2009/08/11/1543650.html 这个要复杂一些 ...
- Access“输入的表达式中含有一个无效日期值”
环境:access2003 + win7 有图有真相: 明显地看到,日期那里显示了“星期X”,问题的根源就在这里... 更改计算机的日期显示设置为不显示星期~ 方法:点击右下角的时钟-点击“更改日期和 ...
- MATLAB一个数组中另一个数组的值
c = setdiff(a,b) 删掉素组a中数组b的元素 如:
- 为什么改了JS数组中的一个元素的值,其他数组元素值都跟着变了
原因: 数组是引用类型,数组变量存储在栈,元素数据存储在堆中,将数组赋值不同的对象,所以的赋值对象都指向堆同一个数据,所以改变其中一个数组中的元素,别的数组元素也会改变. 解决方案: 原理就是先把数组 ...
- 在redis中查询一个KEY的值
写入某个key: set MPM_YYC_XTJ_0 "abcde" [set key value]
- coalesce :返回参数(列名)中第一个非NULL值的字段值
示例 下面的语句返回值 34.(只返回一个值就算后面不为NULL也直接丢弃) SELECT COALESCE( NULL, 34, 13, 0 ) 备注 如果所有参数均为 NULL,则 COALESC ...
- 在vue项目中显示实时时间(年月日时分秒)
1.在data中定义一个变量,存储时间 data(){ return { nowTime:'' } }, 2.给定一个div <div>{{nowTime}}</div> 3. ...
- Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。
Python3 与 C# 面向对象之-继承与多态 文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...
随机推荐
- GitHub远程仓库与本地仓库链接问题
git clone ...时,Failed to connect to 127.0.0.1 port 1080: Connection refused 步骤1------git查看: 查询动态代理 g ...
- layui使用OSS上传
1.首先要把aliyun-oss-sdk.js包下载下来,放到指定的目录下面 在要用的页面引入或者在index.html入口文件全局引入: <script src="util/ali ...
- (Winform程序带源码) 弹出输入框和获取输入框的值
弹出输入框和获取输入框的值: private void button1_Click(object sender, EventArgs e) { string returnValue = Microso ...
- LaTeX in 24 Hours - 1. Introduction
文章目录 1.1 What is LaTeX? 1.2 Why LaTeX Over Other Word Processors 1.3 How to Prepare a LaTeX Input Fi ...
- Cryptanalyzing and Improving a Novel Color Image Encryption Algorithm Using RT-Enhanced Chaotic Tent Maps
Cryptanalyzing and Improving a Novel ColorImage Encryption Algorithm Using RT-EnhancedChaotic Tent M ...
- 使用sync.Once实现高效的单例模式
1. 简介 本文介绍使用sync.Once来实现单例模式,包括单例模式的定义,以及使用sync.Once实现单例模式的示例,同时也比较了其他单例模式的实现.最后以一个开源框架中使用sync.Once实 ...
- C语言 ini 文件读写【Iniparser库】
一.概述 iniparser是针对INI文件的解析器.ini文件则是一些系统或者软件的配置文件.iniparser库的API可以对ini文件(配置文件)进行解析.设置.删除等操作. 常见的 ini 读 ...
- 通过Navicat导入SQLServer的MDF文件和LDF文件
新建查询运行: EXEC sp_attach_db @dbname = '你的数据库名', @filename1 = 'mdf文件路径(包缀名)', @filename ...
- KMP算法的研究
前脚学后脚忘,是时候给自己通俗易懂的总结一下了 KMP是什么 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个字符串S内查找一个词W的出现位置.一个词在不 ...
- WebDriver API及对象识别技术
html页面的iframe的切换: iframe框架在html页面:实际就是多个html页面的相互嵌套:如果存在多个,则操作对象一直停留在主文档页面: 如果需要操作子文档页面则需要实现ifram ...