在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
数据范围
二维数组中元素个数范围 [0,1000]
样例
输入数组: [ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15] ] 如果输入查找数值为7,则返回true, 如果输入查找数值为5,则返回false。
尺取法:
定义两个指针,一个指(0,0),一个指尾(0,n-1),根据特殊性,数组元素(例:1 2 8 9 12 13 15)是递增的,(2 4 9 10 11)递增,(4 7 8)递增,那么可以发现这个数组的右上角的值的特殊性,左面的都比其小,下面的都比其大,也就是可以通过判断这个特殊位置的值的大小(类似于二分查找的mid)来查找元素。
随后转变成移动这个特殊位置x,如果x > target,那么让这个x向左移动,如果x < target,那么让这个x向下移动。
class Solution {
public:
bool searchArray(vector<vector<int>> array, int target) {
if(array.empty() || array[0].empty()) return false; //判断矩阵是否存在
int i = 0,j = array[0].size() - 1; //i行j列
while(i < array.size() && j >= 0)
{
int x = array[i][j]; //定右上角的点为判断逐渐向左下角压缩找到target
if(x == target) return true;
if(x > target) j--;
else i++;
}
return false;
}
};