197 lines
5.2 KiB
Markdown
197 lines
5.2 KiB
Markdown
# 原创
|
||
: 1.剑指Offer编程题之二维数组中的查找
|
||
|
||
# 1.剑指Offer编程题之二维数组中的查找
|
||
|
||
**题目描述:** <br/> 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.
|
||
|
||
**解题思路1:** <br/> - 从左下角元素开始往上查找,右边元素比这个元素大,上边元素比这个元素小,于是,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:** <br/> 从右上角开始查找,左边元素比这个元素小,下边元素比这个元素大,于是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:** <br/> 把每一行看成是一个有序递增数组,利用二分法查找,通过遍历每一行得到答案,时间复杂度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;
|
||
}
|
||
}
|
||
```
|
||
|
||
>
|
||
本实例均通过牛客网在线编译测试。
|
||
|