劍指offer之陣列中的資料查詢
阿新 • • 發佈:2018-12-10
題目描述
在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
解題思路
剛開始想的是先從第一排中找到第一個比目標數大的資料的下標,然後對這個下標之前的資料進行按列的二分查詢,這樣的複雜度是,其中是一行元素的個數,是一列元素的個數。但是這樣仍然會超時。。。所以應該換一個思路。。。
正確的思路應該是從右上角開始,不斷地向左下方逼近,減小問題的規模。由題目給出的規律可知,元素從左往右遞增,從上往下遞增。所以如果右上角的元素如果比目標大,那麼所有右側的列的元素都比目標大,此時列的下標col
row
應該加一向下移動。這個思路的難點在於行列的資料分開來看,同時注意減少問題規模。這樣問題的複雜度是,是行列中較大的一個。
當然,雖然該題目沒有用到二分,不過也正好複習下。二分複習
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;
}
};
```