01 二维数组中的查找

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

 

 思路一 暴力求解

 1 import java.util.*;
 2 public class Solution {
 3     public static boolean Find(int target, int [][] array) {
 4 
 5         // 二维数组为空,要检查三个部分:
 6         //一是数组首地址是否为空
 7         //二是是否为{},也就是array.length==0的情况
 8         //三是{{}},这时array.length=1,但是array[0].length==0。满足任意一个条件就可以返回false了
 9         if(array==null||array.length==0||(array.length==1&&array[0].length==0)){
10             return false;
11         }else{
12             for(int i = 0 ; i < array.length; i++)
13                 for(int j = 0; j < array[0].length; j++){
14                     if (target == array[i][j]) return true;
15                 }
16         }
17         return false;
18     }
19 
20     public static void main(String[] args) {
21         //int [][] array =  {{1,2,3},{4,73,6},{7,8,900}};
22         //boolean result = Find(900, array);
23         //System.out.println("数组中查询的结果是:" + result );
24         Scanner sc = new Scanner(System.in );
25         System.out.println("输入二维数组的行数");
26         int row = sc.nextInt();
27         System.out.println("输入二维数组的列数");
28         int col = sc.nextInt();
29         int [][] array = new int[row][col];
30         System.out.println("输入数组各个元素");
31         for(int i=0;i<row;i++){
32             for(int j=0;j<col;j++)
33                 array[i][j]= sc.nextInt();
34         }
35         boolean result = Find(900, array);
36         System.out.println("数组中查询的结果是:" + result );
37     }
38 }

 思路二

利用二维数组由上到下,由左到右递增的规律,
那么选取右上角或者左下角的元素a[row][col]与target进行比较,
当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
即col--;
当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
即row++;
 1 public class Solution {
 2     public boolean Find(int [][] array,int target) {
 3         int row=0;
 4         int col=array[0].length-1;
 5         while(row<=array.length-1&&col>=0){ //本情况选取的是右上角的元素
 6             if(target==array[row][col])
 7                 return true;
 8             else if(target>array[row][col])
 9                 row++;
10             else
11                 col--;
12         }
13         return false;
14  
15     }
16 }

行长度:array.length
列长度:array[i].length

写左下角元素还是右上角元素都可以,但是一定要写对行和列的长度啊

 

思路三

把每一行看成有序递增的数组,
利用二分查找,
通过遍历每一行得到答案,
时间复杂度是nlogn
 1 public class Solution {
 2     public boolean Find(int [][] array,int target) {
 3          
 4         for(int i=0;i<array.length;i++){
 5             int low=0;
 6             int high=array[i].length-1;
 7             while(low<=high){
 8                 int mid=(low+high)/2;
 9                 if(target>array[i][mid])
10                     low=mid+1;
11                 else if(target<array[i][mid])
12                     high=mid-1;
13                 else
14                     return true;
15             }
16         }
17         return false;
18  
19     }
20 }

 

 

 

posted @ 2019-06-27 09:29  淡如水94  阅读(188)  评论(0)    收藏  举报