搜索一个2D矩阵

版权声明:本文为博主原创文章,转载请注明出处。个人博客地址:https://yangyuanlin.club/ 欢迎来踩~~~~ https://blog.csdn.net/w7239/article/details/85006118

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
欢迎来踩~~~~


猜你喜欢

转载自blog.csdn.net/w7239/article/details/85006118