新闻中心 /News
【综合笔试题】难度 45一道结合了「二分」M6 米乐的图论题
你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。
输入: [[0,2],[1,3]] 输出: 3 解释: 0 2 1 3 时间为0时,你位于坐标方格的位置为 (0, 0)。 此时你不能游向任意方向,因为四个相邻方向平台的高度都大于当前时间为 0 时的水位。 等时间到达 3 时,你才可以游向平台 (1, 1). 因为此时的水位是 3,坐标方格中的平台没有比水位 3 更高的,所以你可以游向坐标方格中的任意位置
由于在任意点可以往任意方向移动,所以相邻的点(四个方向)之间存在一条无向边。
按照题意,我们需要找的是从左上角点到右下角点的最优路径,其中最优路径是指「途径的边的最大权重值最小」,然后输入最优路径中的最大权重值。
我们可以先遍历所有的点,将所有的边加入集合,存储的格式为数组[a, b, w],代表编号为a的点和编号为b的点之间的权重为w(按照题意,w为两者的最大高度)。
当我们有了所有排好序的候选边集合之后,我们可以对边从前往后处理,每次加入一条边之后,使用并查集来查询左上角的点和右下角的点是否连通。
当我们的合并了某条边之后,判定左上角和右下角的点联通,那么该边的权重即是答案。
// edge 存的是 [a, b, w]:代表从 a 到 b 所需要的时间为 w
// 虽然我们可以往四个方向移动,但是只要对于每个点都添加「向右」和「向下」两条边的话,其实就已经覆盖了所有边了
// 从「小边」开始添加,当某一条边别应用之后,恰好使用得「起点」和「结点」联通
在与本题类型的1631. 最小体力消耗路径中,有同学问米乐 M6到是否可以用「二分」。
假设最优解为min的话(恰好能到达右下角的时间)。那么小于min的时间无法到达右米乐 M6下角,大于min的时间能到达右下角。
因此在以最优解min为分割点的数轴上具有两段性,可以通过「二分」来找到分割点min。
接着分析,假设最优解为min,我们在[l, r]范围内进行二分,当前二分到的时间为mid时:
显然check应该是一个判断给定 时间/步数 能否从「起点」到「终点」的函数。
实现check既可以使用 DFS 也可以使用 BFS。两者思路类似,这里就只以 BFS 为例。
这是我们「刷穿 LeetCode」系列文章的第No.778篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:e/LogicStack-LeetCode。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。米乐M6 M6米乐米乐M6 M6米乐