二维数组中的查找Java实现[剑指offer]

题目

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

1以矩形来查找

1.1描述

将二维数组画成矩形,然后从数组中选取一个数字,分3中情况来分析查找的过程,时间复杂度o(n*m),空间复杂度o(1)

1.2code

 1 public class ArrayFind {
 2     private static int[][] A;
 3  
 4     private static int[][] initArray() {
 5         int[][] A = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 },
 6                 { 6, 8, 11, 15 } };
 7         return A;
 8     }
 9  
10     private static void find(int target) {
11         boolean found=false;
12         if (A != null) {
13             int row =0;
14             int column = A[0].length-1;
15             int key;
16             while (row < A.length && column >= 0) {
17                 key = A[row][column];
18                 System.out.println("now key="+key);
19                 if (key == target) {
20                     found=true;
21                     break;
22                 } else if (key < target) {
23                     ++row;
24                 } else {
25                     --column;
26                 }
27             }
28             if(found){
29                 System.out.println("find the targe "+target+" in :" + row + ","
30                         + column + "!");
31             }
32             else{
33                 System.out.println("Sorry not found!");
34             }
35         }
36  
37     }
38  
39     public static void main(String[] args) {
40         // TODO Auto-generated method stub
41         A=initArray();
42         find(14);
43         
44  
45     }
46  
47 }
48 
49 ————————————————
50 版权声明:本文为CSDN博主「暮光_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
51 原文链接:https://blog.csdn.net/u012091092/article/details/45849445

 

2寻找普遍规律

2.1描述

从最后一列开始往回查找,每一列的第一行是该列的最小值,若目标值小于该列第一行,则其小于这一列的所有数字;找到大于等于目标值的该列数并记录col;

从第一行的第col列开始每行查找,每行的第col列是当前行的最大值,找到目标值小于等于第col列的数,记录下行数row;

在row~array.length行和0~col列之间的进行查找对应值即可;时间复杂度是o(n+m),空间复杂度是o(1)

2.2code

 1  public boolean Find(int target, int [][] array) {
 2         //0.判空
 3         if(array==null||array.length==0||array[0].length==0){
 4             return false;
 5         }
 6         //1.先按照列进行判断,将target与第一行每一列的元素进行比较
 7         //第一行每一列的元素是每一列最小的
 8         int col=0;
 9         for(int i=array[0].length-1;i>=0;i--){
10             if(target>=array[1][i]){
11                 col=i;
12                 break;
13             }
14         }
15         //2.按照行进行判断,将target与第col列每一行进行比较
16         //第col列每一行是该行最大的
17         int row=0;
18         for(int i=0;i<array.length;i++){
19             if(target>=array[col][i]){
20                 row=i;
21                 break;
22             }
23         }
24         //3.target就处于0~col和row到array.length之间
25         for(int i=row;i<array.length;i++){
26             for (int j=0;j<=col;j++){
27                 if(array[i][j]==target){
28                     return true;
29                 }
30             }
31         }
32         return false;
33     }

 

posted on 2019-11-10 18:23  ERFishing  阅读(558)  评论(0编辑  收藏  举报