给你一个 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
C++
class Solution {
public:
class stu
{
public:
int val;
vector<int> location;
stu(int value,vector<int> loc)
{
val=value;
location=loc;
}
};
struct cmp
{
bool operator()(stu& A, stu& B)
{
return A.val<B.val;
}
};
int maximumMinimumPath(vector<vector<int>>& A)
{
int m=A.size();
int n=A[0].size();
vector<vector<int>> flag(m,vector<int>(n,0));
priority_queue<stu,vector<stu>,cmp> que;
que.push(stu(A[0][0],{0,0}));
flag[0][0]=1;
while(que.size())
{
auto it=que.top();
que.pop();
auto val=it.val;
auto point=it.location;
int r=point[0];
int c=point[1];
if(r==m-1 && c==n-1)
{
return val;
}
if(r-1>=0)
{
if(0==flag[r-1][c])
{
flag[r-1][c]=1;
auto tmp=min(val,A[r-1][c]);
que.push(stu(tmp,{r-1,c}));
}
}
if(r+1<m)
{
if(0==flag[r+1][c])
{
flag[r+1][c]=1;
auto tmp=min(val,A[r+1][c]);
que.push(stu(tmp,{r+1,c}));
}
}
if(c-1>=0)
{
if(0==flag[r][c-1])
{
flag[r][c-1]=1;
auto tmp=min(val,A[r][c-1]);
que.push(stu(tmp,{r,c-1}));
}
}
if(c+1<n)
{
if(0==flag[r][c+1])
{
flag[r][c+1]=1;
auto tmp=min(val,A[r][c+1]);
que.push(stu(tmp,{r,c+1}));
}
}
}
return -1;
}
};