有序的二維陣列的查詢問題
阿新 • • 發佈:2019-01-24
第二道:有序二維陣列中查詢元素的問題
問題描述:在一個二維陣列中每一行都按照從左到右的順序遞增,每一列也按照從上到下的順序遞增。輸入一個二維陣列和一個整數,判斷陣列中是否有該整數。
例:
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; }