Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang刷leetcode:到达角落需要移除障碍物的最小数目

golang刷leetcode:到达角落需要移除障碍物的最小数目

作者头像
golangLeetcode
发布于 2022-08-02 11:47:49
发布于 2022-08-02 11:47:49
34400
代码可运行
举报
运行总次数:0
代码可运行

给你一个下标从 0 开始的二维整数数组 grid ,数组大小为 m x n 。每个单元格都是两个值之一:

0 表示一个 空 单元格,

1 表示一个可以移除的 障碍物 。

你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。

现在你需要从左上角 (0, 0) 移动到右下角 (m - 1, n - 1) ,返回需要移除的障碍物的 最小 数目。

示例 1:

输入:grid = [[0,1,1],[1,1,0],[1,1,0]]

输出:2

解释:可以移除位于 (0, 1) 和 (0, 2) 的障碍物来创建从 (0, 0) 到 (2, 2) 的路径。

可以证明我们至少需要移除两个障碍物,所以返回 2 。

注意,可能存在其他方式来移除 2 个障碍物,创建出可行的路径。

示例 2:

输入:grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]

输出:0

解释:不移除任何障碍物就能从 (0, 0) 到 (2, 4) ,所以返回 0 。

提示:

m == grid.length

n == grid[i].length

1 <= m, n <= 105

2 <= m * n <= 105

grid[i][j] 为 0 或 1

grid[0][0] == grid[m - 1][n - 1] == 0

解题思路:

1,由于本题有后效性,从上下左右四个方向都可以到达某个节点,所以无法使用动态规划

2,本题其实是起点到终点的最短路径问题,位置为0的地方我们认为路径的最大代价是0,有障碍物的地方代价是1

3,是一个简化版本的dijstra算法

A,我们到达任意节点最多m*n步,可以作为最大路径长度初始化我们的图

B,从起始点出发,我们将距离为0的点的距离该为0,为1的点的距离改成1

C,优先从距离最短的点往周围扩算,即距离为0的点,如果没有距离为0的点,我们可以考虑距离为1的点

D,维护优先队列太麻烦了,本题可以简化成两个数组,数组0是通过距离为0的路径到达的,数组1是经过距离为1的点到达的,每到达一个点加入到对应数组末尾。

E,两个数组一定是递增的

F,所以我们优先取距离最小的,也就是从数组0开始取,由于数组0具有特殊性,都是0,从数组头还是尾取都是一样的,但是数组1,必须从头取

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

func minimumObstacles(grid [][]int) (ans int) {
   m,n:=len(grid),len(grid[0])
   path:=make([][]int,m)
   for i:=0;i<m;i++{
       path[i]=make([]int,n)
       for j:=0;j<n;j++{
           path[i][j]=m*n
       }
   }
   path[0][0]=0
  
  dir:=[]pos{{-1,0},{1,0},{0,-1},{0,1}}

   var q0,q1 []pos
   q0=append(q0,pos{})
   for len(q0)>0 ||len(q1)>0{
       var p pos
       if len(q0)>0{
          p=q0[len(q0)-1]
          q0=q0[:len(q0)-1]
       }else{
          p=q1[0]
          q1=q1[1:]
       }
       for _,d:=range dir{
            p1:=pos{}
           p1.x=p.x+d.x
           p1.y=p.y+d.y
           if p1.x>=0&&p1.x<m && p1.y>=0&&p1.y<n{
               if grid[p1.x][p1.y]==1{
                    if path[p1.x][p1.y]>path[p.x][p.y]+1{
                        path[p1.x][p1.y]=path[p.x][p.y]+1
                         q1=append(q1,p1)
                    }
               }else{
                    if path[p1.x][p1.y]>path[p.x][p.y]{
                        path[p1.x][p1.y]=path[p.x][p.y]
                        q0=append(q0,p1)
                    }
               }
           }
       }
   }
   return path[m-1][n-1]
}

type pos struct {
    x,y int
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 1293. 网格中的最短路径(DP/BFS)
给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物)。 每一步,您都可以在空白单元格中上、下、左、右移动。
Michael阿明
2020/07/13
1.9K0
《连连看》算法c语言演示(自动连连看)
(图片是游戏的示意图,来自互联网,与本文程序无关) 看题目就知道是写给初学者的,没需要的就别看了,自己都觉得怪无聊的。 很多游戏的耐玩性都来自精巧的算法,特别是人工智能的水平。比如前几天看了著名的Alpha GO的算法,用了复杂的人工智能网络。而最简单的,可能就是连连看了,所以很多老师留作业,直接就是实现连连看。 连连看游戏的规则非常简单: 两个图片相同。 两个图片之间,沿着相邻的格子画线,中间不能有障碍物。 画线中间最多允许2个转折。 所以算法主要是这样几部分: 用数据结构描述图板。很简单,一个2
俺踏月色而来
2018/06/21
3.2K0
LeetCode 317. 离建筑物最近的距离(逆向BFS)*
你是个房地产开发商,想要选择一片空地 建一栋大楼。 你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周边全部的建筑物。 请你计算出这个最佳的选址到周边全部建筑物的 最短距离和。
Michael阿明
2021/02/19
1.4K0
LeetCode周赛295,赛后看了大佬的代码,受益良多……
这一场比赛的赞助商是博乐科技,前1000名都可以获得内推机会。和之前50名、100名获得内推的场次比起来有诚意多了。
TechFlow-承志
2022/09/21
4360
LeetCode周赛295,赛后看了大佬的代码,受益良多……
常用的搜索算法之迷宫求解问题
迷宫求解问题是一个经典的图搜索问题,它涉及在给定的迷宫地图中找到一条从起点到终点的路径,同时需要避免遇到障碍物(通常是墙壁)。迷宫可以由二维网格表示,其中每个网格可以是一个可通过的空地、一个障碍物(墙壁)或特殊点(如起点和终点),使用数据结构(如队列、栈或优先队列)来跟踪已访问和待访问的节点。。
jack.yang
2025/04/05
2430
丘比特的箭(点是否在面内)- HDU 1756
对于点A是否在多边形P内的判定, 一般有两种方法:射线法和转角法。 这里介绍一下射线法。
ACM算法日常
2018/08/07
1K0
丘比特的箭(点是否在面内)- HDU 1756
LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)
我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。 蛇会从左上角((0, 0) 和 (0, 1))开始移动。 我们用 0 表示空单元格,用 1 表示障碍物。 蛇需要移动到迷宫的右下角((n-1, n-2) 和 (n-1, n-1))。
Michael阿明
2021/02/19
6600
自动驾驶中的障碍物行为预测
作者简介:Yann,2017年加入美团无人配送部,目前在PNC组负责障碍物预测工作。
美团无人配送
2019/04/26
2.7K0
自动驾驶中的障碍物行为预测
Leetcode 第 167 场周赛题解
Rank 13/1477 5283. 二进制链表转整数 题意:给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。 难度:easy 数据范围: 链表不为空。 链表的结点总数不超过 30。 每个结点的值不是 0 就是 1。 思路:把所有元素放在一个vector里面,然后反转一下从前往后计算即可。 复杂度:O(30) 代码: class Solution { public: int getDecima
BBuf
2019/12/24
4020
java数据结构和算法(七)
1. 二分查找(非递归) 代码实现 public class BinarySearchNoRecursion { public static void main(String[] args) { int[] arr = {1, 23, 46, 413, 880, 999}; int index = binarySearch(arr, 999); System.out.println(index); } /** * 二分查找
shaoshaossm
2022/12/26
4740
java数据结构和算法(七)
2024-12-31:物块放置查询。用go语言,在一个无限延伸的数轴上,原点位于 0 处,沿着 x 轴向正方向无限延伸。 现在我
2024-12-31:物块放置查询。用go语言,在一个无限延伸的数轴上,原点位于 0 处,沿着 x 轴向正方向无限延伸。
福大大架构师每日一题
2025/01/01
580
2024-12-31:物块放置查询。用go语言,在一个无限延伸的数轴上,原点位于 0 处,沿着 x 轴向正方向无限延伸。 现在我
【算法专题】回溯算法
回溯算法是⼀种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护一个状态树,通过遍历状态树来实现对所有可能解的搜索。
YoungMLet
2024/03/01
2220
【算法专题】回溯算法
路径规划算法 | A* 搜索算法
动机:为了在现实生活中近似求解最短路径,例如地图、游戏等存在许多障碍物的情况。我们可以考虑一个含有多个障碍物的二维网格图,我们从起始单元格(下方红色标记)开始,朝着目标单元格(下方绿色标记)前进。
一点人工一点智能
2024/04/24
3220
路径规划算法 | A* 搜索算法
leetcode刷题(130)——最大得分的路径数目
你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。
老马的编程之旅
2022/11/18
2370
leetcode刷题(130)——最大得分的路径数目
漫画:BAT必考题目 (不同路径 - 障碍物版本)
不同路径:一个机器人位于一个 m x n 网格的左上角,起始点在下图中标记为“Start”。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,在下图中标记为“Finish”。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
程序员小浩
2020/03/30
6950
漫画:BAT必考题目 (不同路径 - 障碍物版本)
华为0920秋招笔试真题解析
在PCB印刷电路板设计中,器件之间的连线,要避免线路的阻抗值增大,而且器件之间还有别的器任和别的干扰源,在布线时我们希望受到的干扰尽量小。
五分钟学算法
2023/09/24
5270
华为0920秋招笔试真题解析
2025-04-09:第 K 近障碍物查询。用go语言,我们有一个无限大的二维平面。给定一个正整数 k 和一个二维数组 quer
2025-04-09:第 K 近障碍物查询。用go语言,我们有一个无限大的二维平面。给定一个正整数 k 和一个二维数组 queries,每个元素 queries[i] = [x, y] 表示在平面上的坐标 (x, y) 处建立一个障碍物。系统保证在之前的查询中不会在同一坐标位置再建立障碍物。
福大大架构师每日一题
2025/04/09
680
2025-04-09:第 K 近障碍物查询。用go语言,我们有一个无限大的二维平面。给定一个正整数 k 和一个二维数组 quer
a星算法c++实现_递归算法理解
翻了翻别人写的博客,我看到一个A星算法,只怪自己见识太少,竟然没听过这个算法。网上查了好些资料,自己对这算法理解了些,并用C#实现出来。
全栈程序员站长
2022/11/08
5630
a星算法c++实现_递归算法理解
[数据结构与算法] 盘点工作中常用的算法
案例: 数组 {1,3, 8, 10, 11, 67, 100}, 编程实现二分查找, 要求使用非递归的方式完成.
时间静止不是简史
2020/07/26
1.3K0
华为OD 机试 - 聚餐地点(Java & Python & C++)
小华和小为是很好的朋友,他们约定周末一起吃饭,通过手机交流,他们在地图上选择了很多聚餐地点 (由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能达到的聚餐地点有多少个。
五分钟学算法
2024/04/14
3940
华为OD 机试 - 聚餐地点(Java  & Python & C++)
推荐阅读
相关推荐
LeetCode 1293. 网格中的最短路径(DP/BFS)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验