美文网首页
搜索一个2D矩阵

搜索一个2D矩阵

作者: 静水流深ylyang | 来源:发表于2018-12-14 16:34 被阅读0次

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


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


相关文章

  • LeetCode | 0240. Search a 2D Mat

    LeetCode 0240. Search a 2D Matrix II搜索二维矩阵 II【Medium】【Pyt...

  • 搜索一个2D矩阵

    版权声明:本文为博主原创文章,转载请注明出处。个人博客地址:https://yangyuanlin.club欢迎来...

  • LeetCode 305 [Number of Islands

    原题 给定 n,m,分别代表一个2D矩阵的行数和列数,同时,给定一个大小为 k 的二元数组A。起初,2D矩阵的行数...

  • iOS CGAffineTransform 详解

    CGAffineTransform 定义 用于绘制2D图形的一个仿射变换矩阵。一个仿射变换矩阵用于做旋转、缩放、平...

  • LeetCode之搜索二维矩阵 II——JavaScript实现

    搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵...

  • 48. Rotate Image 旋转图像

    题目 给定一个 nxn 的 2D 矩阵表示的图像,将这个矩阵顺时针旋转 90度。必须在矩阵内做本地替换,不要使用额...

  • 每周 ARTS 第 27 期

    1. Algorithm 搜索二维矩阵 II(中等) 描述: 编写一个高效的算法来搜索 m x n 矩阵 matr...

  • 240-搜索二维矩阵II

    搜索二维矩阵II 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该...

  • CSS3 transform中的Matrix(矩阵)

    1.CSS3中的矩阵 CSS3中的矩阵式一个方法,matrix() 和 matrix3d() 前者为2D平面的移动...

  • CGAffineTransform

    CGAffineTransform用于绘制2D图形的仿射变换矩阵。 仿射变换矩阵用于旋转,缩放,平移或倾斜在图形上...

网友评论

      本文标题:搜索一个2D矩阵

      本文链接:https://www.haomeiwen.com/subject/mnughqtx.html