1. 程式人生 > >有序的二維陣列的查詢問題

有序的二維陣列的查詢問題

第二道:有序二維陣列中查詢元素的問題

問題描述:在一個二維陣列中每一行都按照從左到右的順序遞增,每一列也按照從上到下的順序遞增。輸入一個二維陣列和一個整數,判斷陣列中是否有該整數。

例:

1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

查詢7,返回true;查詢5,返回false。

演算法思路:1.雙層迴圈,逐一比較,時間複雜度為O(n*n)

    2.從中間選擇一個元素num,若是比num大則向陣列的左上方查詢;若是比num小則向陣列的右下方查詢。思路簡單,但是要查詢的數字相對於當前位置有可能在兩個區域中出現,且這兩個區域還有重疊,使得問題變得複雜。

    3.選取陣列的右上角或是左下角的數字和待查數字進行比較。以選取右上角,查詢數字7進行舉例。9 > 7,捨棄第四列;8 > 7,捨棄第三列;2 < 7,捨棄第一行;4 < 7,捨棄第二行;7 = 7,返回true。簡單高效。

下面是第三種想法的實現(右上角為例)

bool Find(vector<vector<int> > array,int target) {
        bool found = false;
        int rows = array.size();
        int columns = array[0].size();
        
        if(!array.empty() && rows > 0 && columns > 0){
            int row = 0;
            int column = columns - 1;
            while(row < rows && column >= 0){
                if(array[row][column] == target){
                    found = true;
                    break;
                }
                else if(array[row][column] > target)
                    -- column;
                    else
                    ++ row;
            }
        }
        return found;
    }