二維陣列查詢

帥地發表於2019-03-15

前言

牛客網劍指offer的66道題,刷起來!每道題會提供簡單的思路以及測試通過的程式碼

題目描述

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

原題連結:https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

解答思路

一種簡單的方法就是整個陣列都遍歷,當然,陣列從左到右,從上到下都是有序的,如果你遍歷整個陣列的話,那就浪費了陣列的區域性有序性了。

如果我們從 row = 0 和col = 0開始遍歷的話,發現右邊的數比 array[row][col] 大,而下邊也比 array[row][col]大,這樣的話,貌似區域性有序性沒有派上用場。

遍歷不一定要從 row = 0 和 col = 0開始,有時候,換個角度,一切就豁然開朗了。實際上我們從陣列的左下角開始遍歷的話,如果 array[row][col] > target,則往右移動,如果array[row][col] < target,則往下移動,否則找到目的數。這樣,就完美利用到區域性有序性了。程式碼如下:

    public boolean Find(int target, int [][] array) {
        if(array == null)return false;
        int row = array.length - 1;
        int col = array[0].length - 1;
        int j = 0;
        while (row >= 0 && j <= col) {
            if (array[row][j] > target) {
                row--;
            } else if (array[row][j] < target) {
                j++;
            } else {
                return true;
            }
        }
        return false;
    }

相關文章