题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e
来源:牛客网
两种思路
第一种是:
把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案。
第一种是:
利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较。以右上角为例,当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col- -;当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;
(右上角)每次移动col和row位置相当于抛弃了当前col以右,row以上的所有行和列。在以a[row][col]为右上角元的子矩阵中再进行查找,直到要查找的元素位于当前子矩阵的右上角或把查找完整个矩阵没有找到,结束。
方法一:
bool Find(int target, vector<vector<int> > array) {
for(int i = 0; i < array.size(); i++){
int low = 0;
int high = array[i].size() - 1;
/*
牛客的编译器不能通过加入break/continue的语句,提示段错误;
if(array[i][low] > target)
break;
if(array[i][high] < target)
continue;
*/
while(low <= high){
int mid = (low + high)/2;
if(array[i][mid] > target)
high = mid - 1;
else if(array[i][mid] < target )
low = mid + 1;
else{
return true;
}
}
}
return false;
}
方法二:
bool Find(int target, vector<vector<int> > array) {
int rows = 0;
int cols = array[0].size()-1;
while(rows < array.size() && cols >= 0){
if(array[rows][cols] == target)
return true;
if(array[rows][cols] > target)
cols--;
if(array[rows][cols] < target)
rows++;
}
return false;
}