最简单的办法就是挨着遍历,但是这样的时间复杂度要搞很多,特别是数组维度比较大时。
思路:
每次选取右上角或者左下角的数字,
以a=[1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15]
为例,从9开始,如果9>target,那么第四列整列都比target大,可以删掉,col-1;如果9<target,那么第一行整行都比target小,可以删掉,rol+1。以此类推直到找到等于target的数。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty())
return false;
int row = 0;//判断行数
int col = array[0].size()-1;
while(row < array.size()&& col >= 0)
{
//总列数不等于总行数
if(target == array[row][col])
{
return true;
}
else if(target < array[row][col])//先判断目标值是否比该行最大值 小
{
--col;//排除高列
}
else//target > array[row][col])//先判断目标值是否比该行最大值 大
{
++row;//排除低行
}
}
return false;
}
};
顺便吐槽下,我加了这个判断后,target和最小值最大值先做比较,反而还不通过,晕
if(target < array[0][0] || target > array[array.size()-1][array[0].size()-1] )
{
return false;
}