Java 有序二维数组查找

1.    数组每行每列都是有序的,可对每行进行二分查找:
public class MyArray {

/**
* 递归实现二分查找
* @param arr
* @param start
* @param end
* @param num
* @return
*/
public static int Binsearch(int arr[],int start,int end,int num){
int mid=(end-start)/2+start;
if(num==arr[mid]){
return mid;
}
if(start>=end)
{
return -1;
}else if(num<arr[mid]){
return Binsearch(arr,start,mid-1,num);
}
if(num>arr[mid]){
return Binsearch(arr,mid+1,end,num);
}
return -1;
}
public static boolean find(int [][]array,int target){
if(array.length==0){
return false;
}

for(int k=0;k<array.length;k++){
int[] arr=array[k];
if(arr.length==0){
return false;
}

int temp=Binsearch(arr,0,arr.length-1,target);
if(temp!=-1){
return true;
}
}
return false;
}
public static void main(String [] args){
int [][]arr1={};//空数组
int [][]arr2=null;//空数组
int [][]arr3=new int[0][0];//长度为0的数组
}

}

注意:空数组和null的区别 测试用例是nul时,如果不加红色判断语句,则会有错误Exception in thread "main" java.lang.NullPointerException,因为对空指针数组引用进行使用,而长度为0的数组就算不加红色部分的判断,for语句也可以判断长度,和对arr3可以进行引用。

2.    数组每行每列都是有序的,那么对于左下角的数来说列是递减的,行是递增的
public class MyArray2 {
public static boolean find(int arr[][],int key){
for(int i=arr.length-1;i>=0;i--){
//System.out.println(i);
for(int j=0;j<arr[i].length;j++){
//System.out.println(j);
if(arr[i][j]>key){
break;
}
if(arr[i][j]==key){
return true;
}
}
}
return false;
}
public static void main(String args[]){
int arr[][]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
System.out.print(find(arr,16));
}
}


猜你喜欢

转载自blog.csdn.net/wangdongli_1993/article/details/80631056