【LeetCode题解】LeetCode 74. 搜索二维矩阵

【题目链接】
74. 搜索二维矩阵

【题目描述】

【题解】

方法一:转换为一维数组

根据题目要求,"每行中的整数从左到右按非严格递增顺序排列,每行的第一个整数大于前一行的最后一个整数",我们可以通过将二维矩阵按照行优先的顺序遍历并拼接为一维数组来解决这个问题。

转换后得到的一维数组将是一个严格单调递增 的序列,符合使用二分查找的条件。由于数组已经按严格递增的顺序排列,因此可以直接套用经典的二分查找模板进行查找。

【AC代码】

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int row = matrix.size();

        vector<int> nums;
        for(int i = 0; i < row; i++) {
            int col = matrix[i].size();
            for(int j = 0; j < col; j++)
                nums.push_back(matrix[i][j]);
        }

        int l = 0, r = nums.size() - 1;
        while(l < r) {
            int mid = (l + r) / 2;
            if(nums[mid] >= target)
                r = mid;
            else
                l = mid + 1;
        }

        if(nums[l] == target)
            return true;
        return false;
    }
};

方法二:一次二分查找

在方法一中,我们通过将二维矩阵转换为一维数组来应用二分查找,这虽然能有效地解决问题,但在实现时需要额外的空间来存储一维数组。实际上,我们可以通过一次二分查找来直接在原矩阵上进行查找,避免额外的空间开销,并且保持二分查找的高效性。

通过观察题目要求:"每行中的整数从左到右按非严格递增顺序排列,每行的第一个整数大于前一行的最后一个整数",我们可以将二维矩阵视为一个升序数组。具体地,矩阵的每一行拼接在一起就会得到一个严格递增的数组。因此,我们可以在这个虚拟的升序数组中使用二分查找来找到目标元素。

通过将矩阵的索引映射 到一维数组的下标,并在该虚拟的升序数组上进行二分查找。对于二维矩阵中的任意下标(i, j),可以将其转换为一维数组的下标k,其关系为:k = i * col + j,其中col为矩阵的列数。反过来,如果知道一维数组中的下标k,我们通过以下公式计算出对应的二维矩阵的行和列:i = k / col(行索引),j = k % col(列索引)

【AC代码】

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int row = matrix.size(), col = matrix[0].size();
        int l = 0, r = row * col - 1;
        while(l < r) {
            int mid = l + r >> 1;
            int val = matrix[mid / col][mid % col];
            if(val >= target)
                r = mid;
            else
                l = mid + 1;
        }

        return matrix[l / col][l % col] == target;
    }
};
相关推荐
小郎君6582 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧2 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm3 小时前
40 二叉树的直径
c++·leetcode
Shimeri3 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J4 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang4 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖4 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy4 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
上班摸鱼下班游戏4 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎
pipixia200334 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间