题意:
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
数据范围:
0 <= n <= 1000
0 <= m <= 1000
解法:
设target=x,
从右上角(0,m-1)开始比较,
1.如果a[0][m-1]=x,那么就找到了,
2.如果a[0][m-1]>x,那么说明a[1][m-1],a[2][m-1]....a[n-1][m-1]都大于x,
所以m-1这一列都可以不用找了,那么从a[0][m-2]开始继续判断.
3.如果a[0][m-1]<x,那么说明a[0][0],a[0][1],a[0][2]......a[0][m-1]都小于x,
所有0这一行都可以不用找了,那么从a[1][m-1]开始继续判断.
重复上述操作即可,用双指针维护当前比较的位置信息.
算法复杂度O(n+m).
code:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& a, int t) {
int n=a.size();
if(n==0)return 0;
int m=a[0].size();
int x=0,y=m-1;
while(x<n&&y>=0){
if(a[x][y]==t)return 1;
if(a[x][y]>t)y--;
else x++;
}
return 0;
}
};