Problem
You are a hiker preparing for an upcoming hike. You are given heights, a 2D array of size rows x columns, where heights[row][col] represents the height of cell (row, col). You are situated in the top-left cell, (0, 0), and you hope to travel to the bottom-right cell, (rows-1, columns-1) (i.e., 0-indexed). You can move up, down, left, or right, and you wish to find a route that requires the minimum effort.
A route’s effort is the maximum absolute difference in heights between two consecutive cells of the route.
Return the minimum effort required to travel from the top-left cell to the bottom-right cell.
Example 1:

1 | Input: heights = [[1,2,2],[3,8,2],[5,3,5]] |
Example 2:

1 | Input: heights = [[1,2,3],[3,8,4],[5,3,5]] |
Example 3:

1 | Input: heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]] |
Constraints:
rows == heights.lengthcolumns == heights[i].length1 <= rows, columns <= 1001 <= heights[i][j] <= 106
Analysis
题目给出了一个矩阵,起点是左上角,终点是右下角,定义Effort为走过的路径中相邻元素的差的绝对值的最大值。要求是找到这个Effort的最小值,不需要求出整个路径。去维护每条路径的Effort是比较困难的,一个是因为路径很多,而且遇到分叉后这个值的维护也很困难,我们需要用另一种更加巧妙的方法去找到这个Effort。
看回题目的要求,要找的是Effort的值,而不需要找到整条路径,我们可以从这个地方切入。从答案作为切入点,无论如何,最后答案的值如果不存在就是0,如果存在,一定会在一个范围中,这个范围就是[1, 1e6]。对于答案存在的情况,我们可以采用二分答案的方法来解决。把题目转化为能否找到一条路径,它的Effort等于k,然后我们不断二分这个k。
判断某个能否找到一条路径的Effor为k这个问题就非常简单了,我们只需要每走一步的时候判断两个相邻位置的差的绝对值和k的关系,如果比k大,说明当前这条路径不符合要求,直接return false,二分法往前半部分继续搜索;如果走到终点都没有超过这个k,说明当前路径的Effort比k小,二分法往后半部分继续搜索。
Solution
遍历的时候因为要避免环的出现,所以需要一个visited矩阵记录已经遍历过的位置。因为这里用的是BFS,用的是queue,里面存放的是坐标,所以是pair。
Code
1 | class Solution { |
Summary
这道题目是难度比较大的一道综合类题目,包括了图的遍历以及二分答案这两个主要的算法知识点。图的遍历应该是比较循规蹈矩的,都是有模版可以参考。而二分答案是在算法题中非常常见的一种算法。这道题这道题目的分享到这里,谢谢您的支持!