1. 程式人生 > >劍指offer之陣列中的資料查詢

劍指offer之陣列中的資料查詢

題目描述

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

解題思路

剛開始想的是先從第一排中找到第一個比目標數大的資料的下標,然後對這個下標之前的資料進行按列的二分查詢,這樣的複雜度是O(Mlog2N)O(M\log_{2}^{N}),其中MM是一行元素的個數,NN是一列元素的個數。但是這樣仍然會超時。。。所以應該換一個思路。。。

正確的思路應該是從右上角開始,不斷地向左下方逼近,減小問題的規模。由題目給出的規律可知,元素從左往右遞增,從上往下遞增。所以如果右上角的元素如果比目標大,那麼所有右側的列的元素都比目標大,此時列的下標col

應該減一向左移動;如果右上角的元素比目標小,那麼所有上方的行的資料都比目標小,此時行的下標row應該加一向下移動。這個思路的難點在於行列的資料分開來看,同時注意減少問題規模。這樣問題的複雜度是O(N)O(N)NN是行列中較大的一個。

當然,雖然該題目沒有用到二分,不過也正好複習下。二分複習

AC程式碼

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array[0].empty()) {
            return false;
} int row = 0, col = array[0].size() - 1, l = array.size(); while(row < l && col >= 0) { if(array[row][col] == target) { return true; } else if(array[row][col] > target) { --col; } else { ++
row; } } return false; } }; ```