1. 程式人生 > 實用技巧 >51搜尋二維矩陣(74)

51搜尋二維矩陣(74)

作者: Turbo時間限制: 1S章節: 二分查詢

晚於: 2020-08-12 12:00:00後提交分數乘係數50%

截止日期: 2020-08-19 12:00:00

問題描述 :

編寫一個高效的演算法來判斷 m x n 矩陣中,是否存在一個目標值。要求使用二分查詢。

該矩陣具有如下特性:

每行中的整數從左到右按升序排列。

每行的第一個整數大於前一行的最後一個整數。

示例 1:

輸入:

matrix = [

[1, 3, 5, 7],

[10, 11, 16, 20],

[23, 30, 34, 50]

]

target = 3

輸出: true

示例 2:

輸入:

matrix = [

[1, 3, 5, 7],

[10, 11, 16, 20],

[23, 30, 34, 50]

]

target = 13

輸出: false

可使用以下main函式:

int main()

{

vector<vector<int> > matrix;

int target;

int m,n,e;

cin>>m;

cin>>n;

for(int i=0; i<m; i++)

{

vector<int> aRow;

for(int j=0; j<n; j++)

{

cin>>e;

aRow.push_back(e);

}

matrix.push_back(aRow);

}

cin>>target;

bool res=Solution().searchMatrix(matrix,target);

cout<<(res?"true":"false")<<endl;

return 0;

}

輸入說明 :

首先輸入matrix的行數m、列數n,

然後輸入m行,每行n個整數。

最後輸入一個整數target。

輸出說明 :

輸出true或false

輸入範例 :

輸出範例 :

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
        if(matrix.empty())
            return false;
        int l=0;
        int r=matrix.size()*matrix[0].size()-1;
        int len=matrix[0].size();
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(matrix[mid/len][mid%len]>target)
                r=mid-1;
            else if(matrix[mid/len][mid%len]<target)
                l=mid+1;
            else
                return true;
        }
    return false;
    }
};

int main()
{
    vector<vector<int> > matrix;
    int target;
    int m,n,e;
    cin>>m;
    cin>>n;
    for(int i=0; i<m; i++)
    {
        vector<int> aRow;
        for(int j=0; j<n; j++)
        {
            cin>>e;
            aRow.push_back(e);
        }
        matrix.push_back(aRow);
    }
    cin>>target;
    bool res=Solution().searchMatrix(matrix,target);
    cout<<(res?"true":"false")<<endl;
    return 0;
}

其實就是一個升序序列,用二分法來做,只不過判斷中間節點時要以二維陣列的方法來判斷。