【面试经典150 | 二分查找】搜索二维矩阵

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:二分查找
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【二分查找】【数组】


题目来源

74. 搜索二维矩阵

【面试经典150 | 二分查找】搜索二维矩阵_第1张图片

题目解读

在二维矩阵中查找指定值,如果存在返回 true,否则返回 false。


解题思路

方法一:二分查找

二维矩阵每行是有序的,每一行的第一个整数都是大于上一行的最后一个整数的,那么吧二维矩阵 “拉直” 形成一维数组,这个数组也是有序的,那么本题就转化为在有序数组中判断是否存在指定值,妥妥的可以使用二分查找来完成。

“拉直” 指的是将矩阵按行进行拼接,得到一个一维数组,下标为二维坐标与一维数的一一映射的值。比如二维矩阵第 i 行第 j 列用 i * m + jm 为二维矩阵的列数)来表示,对应的知道一维的值 x 可以求出对应的二维矩阵的坐标 (x / m, x % m)

接着在一维数组中进行二分查找即可:

  • 初始化指针 l = 0, r = m * n - 1
  • l <= r 时,进行 while 循环判断,当前的二分中点 mid = (r - l) / 2 + l,对应二维矩阵中的值为 x = matrix[mid / m][mid % m]
    • 如果 x < target,更新 l = mid + 1
    • 如果 x > target,更新 r = mid - 1
    • 否则说明查找到 target,直接返回 true
  • 如果退出 while 循环仍然没有找到 target,直接返回 false

实现代码

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

复杂度分析

时间复杂度: O ( n m ) O(nm) O(nm) n n n m m m 分别为二维矩阵的高度和宽度。

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。

你可能感兴趣的:(面试经典150题,二分查找,数组)