劍指OFFER(java)-二維數組中的查找

        題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的數序排列。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數數組

例以下面的二維數組就是每行、每列都遞增排序。若是在這個數組中查找數字7,則返回true,若是要查找5,因爲數組不含有該數字,則返回false函數

1 2 8 9測試

2 4 9 12指針

4 7 10 13排序

6 8 11 15class

當咱們須要解決一個複雜的問題的時候,一個頗有效的方法就是從一個具體的問題入手,經過分析簡單具體的例子,試圖尋找廣泛的規律。針對這個問題,咱們不妨也從一個具體的例子入手。下面咱們能夠在題目中給出的數組中查找數字7爲例來一步步分析查找的過程。test

首先咱們選取數組右上角的數字9,因爲9大於7,而且9仍是第4列的 第一個(也是最小的)數字,所以7不可能出如今數字9的所在列。因而咱們把這一列從須要考慮的區域剔除,以後只須要從分析剩下的3列。在剩下的矩陣中,位 於右上角的數字是8.一樣8大於7,所以8所在的列咱們也剔除。接下來咱們只要分析剩下的兩列便可。方法

在由剩餘的兩列組成的數組中,數字2位於數組的右上角。2小於7,那 麼要查找的7可能在2的右邊,也有可能在2的下邊。在前面的步驟中,咱們已經發現了2的右邊的列都已經被剔除了,也就是說7不可能出如今2的右邊,所以7 有可能出如今2的下邊。因而咱們把數字2所在的行也剔除,只分析剩下的三行兩列數字。在剩下的數字中,數字4位於右上角,和前面同樣,咱們把數字4所在的 行也刪除,最後剩下的兩行兩列數字。im

在剩下的兩行兩列數字4個數字中,位於右上角的恰好就是咱們要查找的數字7,因而查找就能夠結束了。總結

 

總結上述的查找過程,咱們發現了以下規律:首先選取數組中右上角的數 字。若是該數字等於要查找的數字,查找過程結束;若是該數字大於要查找的數字,剔除這個數字所在的列;若是該數字小於要查找的數字,剔除這個數字所在的 行。也就是說若是要查找的數字不在數組的右上角,則每一次都在數組的查找範圍中剔除一行或一列,這樣每一步均可以縮小查找的範圍,直到找到查找的數字,或 者查找範圍爲空。

如圖所示:

package cglib;

public class SingletonClass {

    public static boolean find(int[][] array,int number){
        if(array==null){
        return false;
        }
        int column=array[0].length-1;//列序號從0開始,因此必須減1
        int row=0;//從第一行最後一列開始的數,即右上角的數9開始
        while (row<array.length && column>=0){
        if(array[row][column]==number){
            return true;
        }
        if(array[row][column]>number){//1,2,8,9,9大於7,因此必須往左移
        column--;// 列數減一,表明向左移動
        }else{//2小於7,因此必須往下移
        row++;//行數加一,表明向下移動
        }
        }
        return false;
        }
        public static void main(String args[]){
        int[][] testarray=new int[4][4];
        testarray[0][0]=1;
        testarray[0][1]=2;
        testarray[0][2]=8;
        testarray[0][3]=9;
        testarray[1][0]=2;
        testarray[1][1]=4;
        testarray[1][2]=9;
        testarray[1][3]=12;
        testarray[2][0]=4;
        testarray[2][1]=7;
        testarray[2][2]=10;
        testarray[2][3]=13;
        testarray[3][0]=6;
        testarray[3][1]=8;
        testarray[3][2]=11;
        testarray[3][3]=15;
        
        System.out.println(find(testarray, 7));    // 要查找的數在數組中  
        System.out.println(find(testarray, 5));    // 要查找的數不在數組中  
        System.out.println(find(testarray, 1));    // 要查找的數是數組中最小的數字  
        System.out.println(find(testarray, 15));   // 要查找的數是數組中最大的數字  
        System.out.println(find(testarray, 0));    // 要查找的數比數組中最小的數字還小  
        System.out.println(find(testarray, 16));   // 要查找的數比數組中最大的數字還大  
        System.out.println("空指針:"+find(null, 16));     // 健壯性測試,輸入空指針
        }
        
    
}


輸出:

true false true true false false 空指針:false

相關文章
相關標籤/搜索