一、题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二、我的思路:
设计思路:
从第一行到最后一行起,每一行都是:
先用二分查找找到本行比target小的数字,然后这个数字右边的所有列都比target大,故去除;
即程序中的i1 = binarySearch(target,array[i2],0,i1);(i1即是下一行查找的列的范围最右边)
这一行target左边的数字都比target小,也去除。
即程序中的i2=i2+1;(即下一列)
三、代码
/**
* @ClassName Search01
* Description TODO
* @Auther 青青子衿
* @Date 2019/8/8 10:24
*/
public class Search01 {
public static int binarySearch(int target,int[] array, int start, int end){
if(target>array[end]){
return end;
}
int middle=0;
while(start<=end){
middle = (start+end)/2;
if(array[middle]==target){
return middle;
}else if(array[middle]<target){
start = middle+1;
}else{
end = middle-1;
}
}
if(start>middle){
return middle;
}
if(end<middle){
return middle-1;
}
return -100;
}
public static boolean Find(int target, int [][] array) {
int n1 = array[0].length;
int n2 = array.length;
//判断是否在二维数组范围内
if (n1==0||n2==0) {
return false;
}
if(target<array[0][0]||target>array[n2-1][n1-1]){
return false;
}
int i1=n1-1, i2 = 0;
while(i1>=0&&i2<=n2-1){
i1 = binarySearch(target,array[i2],0,i1);
if(i1>=0&&i2<=n2-1&&target==array[i2][i1]){
return true;
}
i2=i2+1;
}
return false;
}
public static void main(String[] args){
int[][] array ={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
// int[][] array ={{}};
System.out.println(Find(5,array));
}
}
去看了看别人的思路,发现人家的思路比我的明了许多。
https://blog.csdn.net/alidada_blog/article/details/82494856