【剑指Offer】01、二维数组中的查找

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

题解一:二分查找
 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

猜你喜欢

转载自www.cnblogs.com/Blog-cpc/p/12329215.html