面試題4:二維陣列中的查詢
阿新 • • 發佈:2021-11-13
在一個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個高效的函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
我們需要從一個簡單的例子開始,分析題目的規律。當我們選中一個位置的數字後,如果相等,則退出;如果小於要查詢的數字,那麼目標數字在該數字的右邊或者下邊;同理,如果大於要查詢的數字,那麼目標數字在該數字的左邊或者上邊。
分析這樣的重疊區域太複雜,我們可以限制一下選中的數字的位置,比如在角落的數字。以右上角為例,相等則退出;如果小於要查詢的數字,那麼目標數字在該數字的 右邊或者 下邊;同理,如果大於要查詢的數字,那麼目標數字在該數字的左邊 或者上邊
我們通過限制選中的數字的位置,限制了目標區域的範圍,大大減小了分析問題,程式設計的難度。
class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if(matrix.size() ==0 || matrix[0].size() ==0) return false; int n = matrix.size(), m = matrix[0].size(); int i = 0, j = m - 1; //初始位置在矩陣的右上角; while(i < n && j >= 0){ if(matrix[i][j] == target) //等於目標返回真; return true; if(matrix[i][j] > target) //大於目標只需要分析左邊的部分; --j; else ++i; //小於目標只需要分析下邊的部分; } return false; } };
我們也可以從左下角開始分析,但不能從左上角或者右下角開始,那樣需要分析的區域仍然是重疊的。