劍指offer面試題四:二維陣列中的查詢
阿新 • • 發佈:2018-12-13
思路二:利用該二維陣列的特性(時間複雜度為O(n),因為每次比較都會去掉一行或一列)
題目描述
在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
}
};
思路一:遍歷整個二維陣列
暴力遍歷,時間複雜度為 O(N*N);
程式碼如下:
bool Find(int *matrix,int rows,int columns,int number){ if(matrix=!=nullptr&&rows>0&&columns>0&&num >= matrix[0] &&num <=matrix[rows*cols-1]){ for(int i=0;i<rows;++i){ for(int j=0;j<columns;++j){ if(number==matarix[i*cols+j])return true; } } } return false; }
思路二:利用該二維陣列的特性(時間複雜度為O(n),因為每次比較都會去掉一行或一列)
思路:我們選擇陣列最右上角的數字與number比較;
列:假設該 number 為 7,由於 9 > 7,因此根據陣列列元素的遞增規律,最右列的所有元素都大於 7,所以我們可以把最右列從需要考慮的區域內剔除(變數 col-- 即可);
行:假設該 num 為 10,由於 9 < 10,因此根據陣列行元素的遞增規律,第一行的所有元素都小於 10,所以我們可以把第一行從需要考慮的區域內剔除(變數 row++ 即可)。
以下為 num 為 7 時所查詢的過程:
class Solution { public: bool Find(int target, vector<vector<int> > array) { int row=array.size(); int col=array[0].size(); int r=0,c=col-1; while(r>=0&&r<row&&c>=0&&c<col){ if(array[r][c]==target)return true; if(array[r][c]>target){//大於 c--; } else{//小於 r++; } } return false; } };
思路三:二分法(nlogn)
連結:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e
來源:牛客網
public class Solution {
public boolean Find(int [][] array,int target) {
for(int i=0;i<array.length;i++){
int low=0;
int high=array[i].length-1;
while(low<=high){
int mid=(low+high)/2;
if(target>array[i][mid])
low=mid+1;
else if(target<array[i][mid])
high=mid-1;
else
return true;
}
}
return false;
}
}