# 原创
: 1.剑指Offer编程题之二维数组中的查找
# 1.剑指Offer编程题之二维数组中的查找
**题目描述:**
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.
**解题思路1:**
- 从左下角元素开始往上查找,右边元素比这个元素大,上边元素比这个元素小,于是,target比这个元素小就往上找,比这个元素大就往右找.如果出现边界,则查找失败.
C/C++
```
class Solution{
public:
//二维向量这里最外的<>要有空格。否则在比较旧的编译器下无法通过
bool Find(int target, vector< vector<int> >array){
if(array.empty()) return false;
int rows = array.size();
int cols = array[0].size();
int i=rows-1,j=0; //左下标元素坐标
while(i>=0&&j<cols){
if(target<array[i][j]) --i;
else if(target>array[i][j]) ++j;
else return true;
}
return false;
}
};
```
Python2
```
class Solution:
def Find(self,target,array):
rows = len(array)
cols = len(array[0])
i = rows-1
j = 0
while j<cols and i>=0:
if target<array[i][j]:
i -= 1
elif target>array[i][j]:
j += 1
else:
return True
return False
```
Java
```
public class Solution{
public boolean Find(int target, int [][] array){
int rows = array.length;
int cols = array[0].length;
int i = rows-1,j=0;
while(i>=0&&j<cols){
if(target<array[i][j])--i;
else if(target>array[i][j])++j;
else return true;
}
return false;
}
}
```
**解题思路2:**
从右上角开始查找,左边元素比这个元素小,下边元素比这个元素大,于是target比这个元素大,则往下找,比这个元素小则往左找,出现边界查找失败.
C/C++
```
class Solution{
public:
//二维向量这里最外的<>要有空格。否则在比较旧的编译器下无法通过
bool Find(int target, vector< vector<int> >array){
if(array.empty())return false;
int rows = array.size();
int cols = array[0].size();
int i=0,j=cols-1;
while(i<=rows-1&&j>=0){
if (target<array[i][j])--j;
else if(target>array[i][j])++i;
else return true;
}
return false;
}
};
```
Python2
```
class Solution:
def Find(self,target,array):
rows = len(array)
cols = len(array[0])
i = 0
j = cols-1
while i<rows-1 and j>=0:
if target<array[i][j]:
j -= 1
elif target>array[i][j]:
i += 1
else:
return True
return False
```
Java
```
public class Solution{
public boolean Find(int target, int [][] array){
int rows = array.length;
int cols = array[0].length;
int i=0,j=cols-1;
while(i<=rows-1&&j>=0){
if(target<array[i][j])--j;
else if(target>array[i][j])++i;
else return true;
}
return false;
}
}
```
**解题思路3:**
把每一行看成是一个有序递增数组,利用二分法查找,通过遍历每一行得到答案,时间复杂度nlogn.
C/C++
```
class Solution{
public:
bool Find(int target,vector< vector<int> >array){
if(array.empty()) return false;
int length=array.size();
for(int i=0;i<length;++i){
int low = 0;
int high = array[i].size()-1;
while(low<=high){
int mid = (low+high)/2;
if(target>array[i][mid]) low=mid+1;
else if(target<array[i][mid]) high=mid-1;
else return true;
}
}
return false;
}
};
```
Python2
```
class Solution:
def Find(self,target,array):
length=len(array)
for i in range(length):
low = 0
high = len(array[i])-1
while low<=high:
mid = (low+high)/2
if target>array[i][mid]:
low = mid + 1
elif target<array[i][mid]:
high = mid-1
else:
return True
return False
```
Jave
```
public class Solution{
public boolean Find(int target, int [][] array){
int length=array.length;
for(int i=0;i<length;++i){
int low = 0;
int high = array[i].length-1;
while(low<=high){
int mid = (low+high)/2;
if(target>array[i][mid])low=mid+1;
else if(target<array[i][mid])high=mid-1;
else return true;
}
}
return false;
}
}
```
>
本实例均通过牛客网在线编译测试。