leetcode 1293. Shortest Path in a Grid with Obstacles Elimination | 1293. 网格中的最短路径(BFS)

本文主要是介绍leetcode 1293. Shortest Path in a Grid with Obstacles Elimination | 1293. 网格中的最短路径(BFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

https://leetcode.com/problems/shortest-path-in-a-grid-with-obstacles-elimination/
在这里插入图片描述

题解

DFS 递归超时,看了评论区 & 答案区,没有可运行的 DFS 解法,这题只能 BFS。疑问:DFS 的复杂度是多少?

尝试改成带缓存的递归,但是由于 visited 数组的存在,当前状态还与整个 visited 表有关,dfs(x, y, k) 三个参数不足以表示当前状态,无法加缓存,除非将 visited 数组也当做缓存的一个维度。

尝试用 dp[x][y][k] 剪枝优化,如果已经遇到过 dp[x][y][k],且之前的 k 大于当前的 k,则剪枝,此优化几乎无效果。

总结:带有visited数组的回溯是一种有后效性的递归,无法转换成dp.

BFS 参考:Java-Straightforward-BFS-O(MNK)-time-or-O(MNK)-space

方法1:DFS(TLE)

本地测过几个例子,代码应该没问题。

class Solution {int M;int N;public int shortestPath(int[][] grid, int k) {M = grid.length;N = grid[0].length;boolean[][] visited = new boolean[M][N];k = grid[0][0] == 1 ? k - 1 : k;int res = bfs(0, 0, 0, k, grid, visited);System.out.println(res);return res == Integer.MAX_VALUE ? -1 : res;}// at position (x,y), remain k obstacles to remove// if valid, return min stepspublic int bfs(int steps, int x, int y, int k, int[][] grid, boolean[][] visited) {if (x < 0 || x >= M || y < 0 || y >= N || visited[x][y] || k < 0) return Integer.MAX_VALUE;if (x == M - 1 && y == N - 1) return steps;int t = grid[x][y] == 0 ? k : k - 1;visited[x][y] = true;int p1 = bfs(steps + 1, x, y - 1, t, grid, visited);int p2 = bfs(steps + 1, x, y + 1, t, grid, visited);int p3 = bfs(steps + 1, x - 1, y, t, grid, visited);int p4 = bfs(steps + 1, x + 1, y, t, grid, visited);visited[x][y] = false;return Math.min(Math.min(p1, p2), Math.min(p3, p4));}
}
方法2:BFS(AC)
class Solution {int M;int N;int[][] ways = new int[][]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};public int shortestPath(int[][] grid, int k) {M = grid.length;N = grid[0].length;Queue<int[]> queue = new LinkedList<>();boolean[][][] visited = new boolean[M][N][k + 1];visited[0][0][0] = true;queue.offer(new int[]{0, 0, 0});int step = 0;while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {int[] record = queue.poll();int x = record[0];int y = record[1];int curK = record[2];if (x == M - 1 && y == N - 1) return step;for (int[] way : ways) { // 4个方向int nextX = x + way[0];int nextY = y + way[1];int nextK = curK;if (nextX >= 0 && nextX < M && nextY >= 0 && nextY < N) {if (grid[nextX][nextY] == 1) nextK++;if (nextK <= k && !visited[nextX][nextY][nextK]) {visited[nextX][nextY][nextK] = true;queue.offer(new int[]{nextX, nextY, nextK});}}}}step++;}return -1;}
}

在这里插入图片描述

这篇关于leetcode 1293. Shortest Path in a Grid with Obstacles Elimination | 1293. 网格中的最短路径(BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/556958

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os