力扣练习——51 搜索二维矩阵

1.问题描述

编写一个高效的算法来判断 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;

}

2.输入说明

首先输入matrix的行数m、列数n,

然后输入m行,每行n个整数。

最后输入一个整数target。

3.输出说明

输出true或false

4.范例

输入

3 4
1 3 5 7
10 11 16 20
23 30 34 50
3

输出

true

5.代码

#include <iostream>
#include <queue>
#include <cstdlib>
#include <cstring>

using namespace std;


bool searchMatrix(vector<vector<int> > matrix, int target)
{
    //二分查找判断target是否存在
    //直接将所有行拼接成一行
    int m = matrix.size();//行数
    int n = matrix[0].size();//列数

    if (matrix[0][0] > target || matrix[m - 1][n - 1] < target)//若target不在提供的范围内(不满足大于等于最小值,小于等于最大值)
        return false;
    vector<int>nums;//不要写成nums(m*n),否则总长度会变成2*m*n
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            int tmp = matrix[i][j];
            nums.push_back(tmp);
        }
    }
    
    //二分查找
    int low = 0;
    int high = m * n - 1;
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (nums[mid] > target)//左半边寻找
            high = mid - 1;
        else if (nums[mid] < target)
            low = 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 = searchMatrix(matrix, target);

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

    return 0;

}

 

posted @ 2022-08-05 17:31  努力奋斗的小企鹅  阅读(54)  评论(0)    收藏  举报