题目:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
解答:主要考虑是二分查找
bool Find(int target,vector<vector<int>> array) {
if (array.size() == 0 || array[0].size() == 0)return false;
int l1 = array.size();
int l2 = array[0].size();
if (array[0][0] > target || array[l1 - 1][l2 - 1] < target)return false;
int left = 0, right = l1 - 1, middle;
while (left <= right) {
middle = (left + right) / 2;
if (array[0][middle] < target) {
left=middle+1;
} else if (array[0][middle] > target) {
right=middle-1;
} else {
return true;
}
}
int index;
if(array[0][right]<target){
index=right;
}else{
index=left;
}
left=0;right=l2-1;
while(index>0) {
while (left <= right) {
middle = (left + right) / 2;
if (array[middle][index] < target) {
left = middle + 1;
} else if (array[middle][index] > target) {
right = middle - 1;
} else {
return true;
}
}
index--;
left=0;
right=l2-1;
}
return false;
}
运行结果:
其他答案参考引用:(逐步遍历思想)
class Solution {
public:
bool Find(vector<vector<int> > array,int target) {
int m,n,x,y;
m = array.size();//行数
n = array[0].size();//列数
x=m-1;y=0;//坐标定在左下角
while(x>=0 && y<=n-1){
if(target<array[x][y]){
x--;//遇小上移
}
else if(target>array[x][y]){
y++;//遇大右移
}
else {
return true;
}
}
return false;
}
};