分析
本题可以先从列进行二分,之后找出每一列的最小值,得到该点坐标(row,col)
因为本题让随便返回一个极小值,所以
- 如果此时在同一行这个数左边的数比它小,就更新二分的右边界
- 如果此时在同一行这个数右边的数比它小,就更新二分的左边界
C++ 代码
// Forward declaration of queryAPI.
// int query(int x, int y);
// return int means matrix[x][y].
class Solution {
public:
const int N = INT_MAX;
vector<int> getMinimumValue(int n) {
int l=0,r=n-1;
while(l<=r){
int t=N,row=0,col=(l+r)>>1; //二分出一列,找这个列上最小的数的位置(row,col)
for(int i=0;i<n;i++)
{
int temp=query(i,col);
if(t>temp)
{
t=temp;
row=i;
}
}
if(col-1>=0 && query(row,col-1)<t) //在同一行,左边的列比当前的值更小,就将右边界缩小,变为col-1
{
r=col-1;
continue; //继续找极小值
}
if(col+1<n && query(row,col+1)<t) //在同一行,右边的列比当前的值更小,就将左边界扩大,变为col+1
{
l=col+1;
continue; //继续找极小值
}
return {row,col};
}
return {-1,-1}; //没找到,返回{-1,-1}
}
};