题目
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
数据范围
-
还是老样子大家先思考本问题!
-
我们来想这道题的关键点 它的每一行是递增的, 每一列是递增的, 并且这道题的意思是让找是否有与目标值相同的值很容易想到log(n)的二分, 没错这道题最好的方法就是二分, 但是这个二分有点扩展
-
思路: 我们从右上角开始二分 找两个指针一个是行row = 0, col = nums[0].size() - 1;
-
然后 如果target > num 那当前行就不会出现目标值了 所以 row ++;
-
当 target < num 我们来想 比目标值小的有两个方向, 但是我们是从最上面下来的所以本行上面不可能出现目标值 否则我们不会来到下面这一行, 所有只有目标值会出现在本行 也就是 col --;
-
target == num 那就是目标值
代码:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& a, int target) {
if (a.size() == 0) return false;
//从右上角开始查找
int rows = 0, col = a[0].size() - 1;
while (rows < a.size() && col >= 0){
int num = a[rows][col];
if (num == target) return true;
else if (num > target) col --;
else rows ++;
}
return false;
}
};