前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)

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

作者头像
Michael阿明
发布2021-02-19 10:54:26
1.3K0
发布2021-02-19 10:54:26
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

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

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

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

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

示例 1:

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

示例 2:

代码语言:javascript
复制
输入:[[2,2,1,2,2,2],[1,2,2,2,1,2]]
输出:2

示例 3:

代码语言:javascript
复制
输入:[[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

代码语言:javascript
复制
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 极大极小化 二分查找

LeetCode 1231. 分享巧克力(极小极大化 二分查找)

LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)

代码语言:javascript
复制
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;
        	}
        	else
        		r = 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
    • 2.1 优先队列BFS
      • 2.2 极大极小化 二分查找
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档