当前位置: 代码迷 >> 综合 >> LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)
  详细解决方案

LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)

热度:95   发布时间:2024-02-08 02:24:01.0

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 优先队列BFS
      • 2.2 极大极小化 二分查找

1. 题目

给你一个 R 行 C 列的整数矩阵 A。矩阵上的路径从 [0,0] 开始,在 [R-1,C-1] 结束。

路径沿四个基本方向(上、下、左、右)展开,从一个已访问单元格移动到任一相邻的未访问单元格。

路径的得分是该路径上的 最小 值。例如,路径 8 → 4 → 5 → 9 的值为 4 。

找出所有路径中得分 最高 的那条路径,返回其 得分。

示例 1:
在这里插入图片描述

输入:[[5,4,5],[1,2,6],[7,4,6]]
输出:4
解释: 
得分最高的路径用黄色突出显示。 

示例 2:
在这里插入图片描述

输入:[[2,2,1,2,2,2],[1,2,2,2,1,2]]
输出:2

示例 3:
在这里插入图片描述

输入:[[3,4,6,3,4],[0,2,1,1,7],
[8,8,3,2,7],[3,2,4,9,8],
[4,1,2,0,0],[4,6,5,4,3]]
输出:3提示:
1 <= R, C <= 100
0 <= A[i][j] <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-with-maximum-minimum-value
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 优先队列BFS

B站大佬讲解:LeetCode 1102. Path With Maximum Minimum Value

struct point
{int x;int y;int val;point(int x0, int y0, int v){x = x0;y = y0;val = v;}
};
struct cmp
{bool operator()(point& a, point& b) {return a.val < b.val;//值大的优先}
};
class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
public:int maximumMinimumPath(vector<vector<int>>& A) {int m = A.size(), n = A[0].size(), i, j, x, y, k, ans = A[0][0];vector<vector<bool>> visited(m, vector<bool>(n,false));visited[0][0] = true;priority_queue<point,vector<point>,cmp> q;q.push(point(0, 0, A[0][0]));while(!q.empty()){ans = min(ans, q.top().val);i = q.top().x;j = q.top().y;q.pop();if(i==m-1 && j==n-1)return ans;for(k = 0; k < 4; ++k){x = i + dir[k][0];y = j + dir[k][1];if(x>=0 && x<m && y>=0 && y<n && !visited[x][y]){q.push(point(x, y, A[x][y]));visited[x][y] = true;}}}return ans;}
};

1000 ms 25.8 MB

2.2 极大极小化 二分查找

class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};int m, n, ans;
public:int maximumMinimumPath(vector<vector<int>>& A) {m = A.size(), n = A[0].size();int l = 0, r = min(A[0][0], A[m-1][n-1]);while(l <= r){vector<vector<bool>> visited(m, vector<bool>(n,false));int midval = (l+r)/2;if(canfindpath(A,visited,0,0,midval))//能找到任意一条路径,其所有值都大于等于 midval{ans = midval;l = midval + 1;}elser = midval-1;}	return ans;}bool canfindpath(vector<vector<int>>& A, vector<vector<bool>>& visited, int i, int j, int v){int x, y, k;visited[i][j] = true;if(i==m-1 && j==n-1)return true;for(k = 0; k < 4; ++k){x = i + dir[k][0];y = j + dir[k][1];if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && A[x][y] >= v){if(canfindpath(A, visited,x,y,v))return true;}}return false;}
};

356 ms 28 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明