1. 程式人生 > 其它 >面試題4:二維陣列中的查詢

面試題4:二維陣列中的查詢

在一個 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;
    }
};

我們也可以從左下角開始分析,但不能從左上角或者右下角開始,那樣需要分析的區域仍然是重疊的。