您的位置:首页 > Web前端

剑指第四题:二维数组中的查找

2018-03-05 15:31 134 查看
/*
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
*/
/*****************
二维数组中的查找  递增
按行遍历
******************/

class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty()) return 0;
int lin = array.size();
for(int i=0;i<lin;i++){
int col = array[i].size();
if(!col) continue;
else if(target >= array[i][0]){
if(target <= array[i][col-1]){
for(int j=col-1;j>=0;j--){
if(target == array[i][j])
return 1;
else if(target > array[i][j]) break;
}
}
}
else continue;
}
return 0;
}
};
/*****************
二维数组中的查找  递增
按列遍历
******************/

class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty()) return 0;
int lin = array.size();
int col = array[0].size();
for(int j=col-1;j>=0;j--){
if(target >= array[0][j]){
for(int i=0;i<lin;i++){
if(target == array[i][j])
return 1;
else if(target < array[i][j])
break;
}
}
else continue;
}
return 0;
}
};
/*****************
二维数组中的查找  递增
行列 综合循环 左下角开始
******************/
class Solution {
public:
bool Find(int target,vector<vector<int> > array) {
int rowCount = array.size();
int colCount = array[0].size();
int i,j;
for(i=rowCount-1,j=0;i>=0&&j<colCount;)
{
if(target == array[i][j])
return true;
if(target < array[i][j])
{
i--;
continue;
}
if(target > array[i][j])
{
j++;
continue;
}
}
return false;
}
};
/*****************
二维数组中的查找  递增
行列 综合循环 右上角开始
******************/
class Solution {
public:
bool Find(int target,vector<vector<int> > array) {
int row = array.size();
int col = array[0].size();
int i,j;
for(i=0,j=col-1;i<row&&j>=0;){
if(target < array[i][j])
{
j--;
continue;
}
else if(target > array[i][j]){
i++;
continue;
}
else
return 1;

}
return 0;

}
};

/*****************
二维数组中的查找  递增
二分法 O(nlogn)
******************/
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty()) return 0;
int lin = array.size();
for(int i=0; i<lin; i++){
int start=0,end=array[i].size()-1;
if(!end)
return 0;
while(end>=start)
{
int mid = ((end-start)>>1) + start;
if(target > array[i][mid])
start = mid + 1;
else if(target < array[i][mid])
end = mid -1;
else
return 1;

}
}
return 0;
}
};

二维数组的两个参考练习 http://blog.csdn.net/a819825294/article/details/52088732 http://blog.csdn.net/hou09tian/article/details/70889235 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer