题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:在以下二维数组中查找数字 7 ,返回值为true;查找 3 返回值为 false。
分析:
方法一:首先将target与二维数组第一行比较,当target大于,某一数据时停止比较,记录当前位置,然后从当前位置倒着依次与target进行比较。
public static boolean search1(int[][] arr,int target){
//若数组为空直接返回 false
if(arr.length == 0 || arr[0].length == 0){
return false;
}
//与二维数组第一行进行比较,确定count的值
int count = -1;
for(int i =0;i<arr.length;i++){
if(arr[0][i] > target){
break;
}
count++;
}
//倒着进行比较
for(int i=count;i>=0;i--){
for(int j=0;j< arr.length;j++){
if(arr[j][i] == target){
return true;
}
}
}
return false;
}
方法二:对二维数组的每一行进行二分查找
public static boolean search2(int[][] array,int target){
//若数组为空,直接返回false
if(array.length == 0 || array[0].length == 0){
return false;
}
for(int i=0;i< array.length;i++){
int low = 0;
int high = array.length-1;
while (low <= high){
int mid = (low + high)/2;
int midVal = array[i][mid];
if(target == midVal){
return true;
}else if(midVal > target){
high = mid - 1;
}else{
low = mid + 1;
}
}
}
return false;
}
方法三:从二维数组的右上角开始查找。若大于target,则row++;若小于target,则col--。
public static boolean search3(int[][] array,int target){
//若数组为空,直接返回false
if(array.length==0 || array[0].length==0){
return false;
}
//获得左上角元素
int row = 0;
int col = array[0].length-1;
while (row<=array.length-1 && col>=0){
int value = array[row][col];
if(value == target){
return true;
}else if(target > value){
row++;
}else{
col--;
}
}
return false;
}