【劍指Offer】1、二維數組中的查找


  題目描述:

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

  解題思路:

  很明顯,由於該二維數組上到下遞增,左到右遞增的特殊性,遍歷整個矩陣進行查找不是該題目的意圖所在。總結規律我們可以發現:應該從矩陣的右上角或者左下角開始查找。

  以右上角為例,首先選取右上角的數字,如果該數字等於要查找的數字,則查找過程結束;如果該數字大於要查找的數字,則說明該列其他元素都大於要查找的數字,便可以刪掉該列;如果該數字小於要查找的數字,則說明該行其他元素也都小於要查找的數字,便可以刪掉該行。

  這樣,每一次比較都可以剔除一行或者一列,進而縮小查找范圍,時間復雜度為O(n)。

  舉例:

  比如在下面的二維數組中查找數字7,查找過程如下:

  編程實現(Java):

public class Solution {
    public boolean Find(int target, int [][] array) {
        /*
        思路:從左下角(或者右上角)開始查找,因為該行右邊大於它,上邊小於它,每次比較可以刪除某一行或者某一列
        注意:左上和右下不可以,因為無法減小問題規模(行和列都無法刪除)
        */
        if(array==null)
            return false;
        int row=array.length; //行數
        int col=array[0].length; //列數
        for(int i=row-1,j=0;i>=0&&j<col;){ //從左下角開始查找
            if(array[i][j]==target) //找到
                return true;
            else if(array[i][j]>target) //不可能在該行,跳過該行
                i--;
            else //不可能在該列,跳過該列
                j++;
        }
        return false;
    }
}


免責聲明!

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



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