1. 从二维数组查找某个数
一、问题描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二、解决方案
1、针对每一行进行二分查找
- 实现针对一维数组的二分查找方法
- 获取二维数组行数,按每行为单位执行二分查找方法
- 时间复杂度:O(M*logN)
public boolean Find(int target, int [][] array) {
if(array==null||array.length<0){
return false;
}
int row =array.length;
int col = array[0].length;
// 边界判断
if(target<array[0][0]||target>array[row-1][col-1]){
return false;
}
for(int i=0;i<row;i++){
if(erfen(array[i], target)){
return true;
}
}
return false;
}
/**
* 二分查找的实现套路
* --整体思路:不断缩小查找范围,查找范围对半砍。
* --while循环:因为不知道什么时候能找到,所以用while循环
* --while循环的边界条件
* --<:等s==e时,跳出循环,需要在循环外再比较一次
* --<=:当s==e时,在循环内判断。
* --所以<或者<=都行。
* --s,e的更新
* --以target为中心
* --target在前部,更新e
* --target在后部,更新s
*/
public boolean erfen(int[] array,int target){
int s=0;
int e=array.length-1;
int mid=-1;
while(s<=e){
mid=(s+e)/2;
if(array[mid]==target){
return true;
}
if(array[mid]<target){
s=mid+1;
}else{
e=mid-1;
}
}
return false;
}
2、从左下角(或右上角)开始,向上变小,向右变大
- 获取左下角的i,j
- 逐步比较向上或右移动
- 时间复杂度:O(行高+列高)
- 空间复杂度:O(1)
public static boolean f1(int [][] array,int target){
if(array==null||array.length<0){
return false;
}
int row =array.length;
int col = array[0].length;
if(target<array[0][0]||target>array[row-1][col-1]){
return false;
}
int i=row-1,j=0;
while(i>=0&&j<=col-1){
if(array[i][j]==target){
return true;
}
if(array[i][j]<target){
j++;
}else{
i--;
}
}
return false;
}