题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题解一:二分查找
1 /** 2 把每一行看成有序递增的数组, 3 利用二分查找,通过遍历每一行得到答案 4 时间复杂度是nlogn 5 */ 6 public static boolean Find(int target, int [][] array) { 7 for(int i=0;i<array.length;i++){ 8 int low=0; 9 int high=array[i].length-1; 10 while(low<=high){//必须要加上等号 11 int mid=(low+high)>>1; 12 if(target>array[i][mid]) 13 low=mid+1; 14 else if(target<array[i][mid]) 15 high=mid-1; 16 else 17 return true; 18 } 19 } 20 return false; 21 }
1 /** 2 * 利用二维数组由上到下,由左到右递增的规律 3 * 那么选取右上角或者左下角的元素a[row][col]与target进行比较, 4 * 当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--; 5 * 当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++; 6 */ 7 public static boolean Find01(int target, int [][] array) { 8 int row=0;//行 9 int col=array[0].length-1;//列,即二维表的右上角 10 while (row<array.length&&col>=0){ 11 if(target==array[row][col]) 12 return true; 13 else if(target<array[row][col]) 14 col--; 15 else 16 row++; 17 } 18 return false; 19 }
测试:
1 public static void main(String[] args) { 2 int[][] arr={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; 3 int tar=1; 4 boolean find = Find01(tar, arr); 5 System.out.println(find); 6 } 7 输出: 8 true