1. 程式人生 > >劍指offer面試題四:二維陣列中的查詢

劍指offer面試題四:二維陣列中的查詢

 

題目描述

思路一:遍歷整個二維陣列

思路二:利用該二維陣列的特性(時間複雜度為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;
 
    }
}