1. 程式人生 > >搜尋一個2D矩陣

搜尋一個2D矩陣

Search A 2D Matrix(搜尋一個2D矩陣)

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:

[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]

Given target =3, returntrue.

題目大意

寫一個高效的演算法在M * N的矩陣中查詢值。這個矩陣有如下屬性:
(1)每一行的整數從左往右按從小到大的順序排列;
(2)每一行的第一個整數大於上一行的最後一個整數。
例如,在上圖中所給出的矩陣中查詢3,返回值為true

暴力查詢

思路

兩重迴圈遍歷二維vector陣列,找到返回true,找不到返回false。時間複雜度為O(N^2)

程式碼

// 暴力查詢
bool searchMatrix(vector<vector<int> > &matrix, int target)
{
    for(int i=0; i<matrix.size(); i++)
        for(int j=0; j<matrix[i].size(); j++)
            if(matrix[i][j] == target)
                return true;
    return false;
}

優化後的暴力查詢

思路

按照所給的矩陣的屬性從右上角開始查詢,如果等於查詢值,就返回true,如果比target值小,向下查詢,如果比target大,向右查詢,一旦向右查詢找不到說明沒有,就停止查詢。時間複雜度為***

程式碼

// 優化的暴力查詢
bool searchMatrix(vector<vector<int> > &matrix, int target)
{
    int m = matrix.size();
    int n = matrix[0].size();
    for(int i=0; i<m; i++)
    {
        if(matrix[i][n-1] < target)
            continue;
        if(matrix[i][n-1] == target)
            return true;
        for(int j=n-2; j>=0; j--)
            if(matrix[i][j] == target)
                return true;
        if(matrix[i][n-1] > target)
            break;
    }
    return false;
}

二分查詢

思路

用二分查詢的思想來查詢,因為二維陣列是按序排列的,所以用二分查詢效率更高。

程式碼

// 二分查詢
bool searchMatrix(vector<vector<int> > &matrix, int target)
{
    if(matrix.empty() || matrix.size()==0 || matrix[0].size()==0)
        return false;
    int m = matrix.size(), n = matrix[0].size();
    int start = 0, end = m*n-1;
    while(start <= end)
    {
        int mid = (start + end) / 2;
        int row = mid / n;
        int col = mid % n;
        if(matrix[row][col] == target)
            return true;
        else if(matrix[row][col] > target)
            end = mid - 1;
        else if(matrix[row][col] < target)
            start = mid + 1;
    }
    return false;
}

以上。


版權宣告:本文為博主原創文章,轉載請註明出處。
個人部落格地址:https://yangyuanlin.club
歡迎來踩~~~~