二维数组中的查找
参与人数:6536时间限制:1秒空间限制:32768K
题目描述:
参与人数:6536时间限制:1秒空间限制:32768K
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
我的想法:
(1)在这个二维数组中,左上角的值是最小的,右下角的值是最大的,如果想要查找的某个整数target小于最小值或者大于最大值,判断一次就OK了。如果target在这个范围内,无论是从右下角还是左上角判断,都会产生分支。如果从左上角开始,需要分成向下和向右两个方向判断。如果从右下角开始,需要分成向上和向左两个方向判断。越想越感觉像搜索,复杂度会比较高,没有利用好该数组的特性。
(2)换一种尝试,可以从右上角或者左下角开始。从左下角开始,如果target比该位置的小,则向上搜索;如果target比该位置的数大,则向右搜索。右上角同理。
代码:
从左下角开始:
class Solution {
public:
bool Find(vector<vector<int> > array,int target) {
//从左下角向右上角搜索
int row = array.size();
int col = array[0].size();
int x = row-1;
int y = 0;
while(x>=0 && y<col){
if (array[x][y]==target){
return true;
}
else if(array[x][y]<target){
y++;
}
else{
x--;
}
}
return false;
}
};
class Solution {
public:
bool Find(vector<vector<int> > array,int target) {
//从左下角向右上角搜索
int row = array.size();
int col = array[0].size();
int x = 0;
int y = col-1;
while(x<row && y>=0){
if (array[x][y]==target){
return true;
}
else if(array[x][y]<target){
x++;
}
else{
y--;
}
}
return false;
}
};