二維數組中的查找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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM