leetcode热题HOT 74. 搜索二维矩阵

一、问题描述:

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。

每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

二、二分查找:

1、思路分析:使用二分查找的思想,将二维矩阵当作一维数组来处理。

将二维矩阵展开成一维数组后,可以通过计算元素在一维数组中的索引来访问对应的元素。

设定搜索范围为一维数组的起始位置到结束位置,然后在该范围内进行二分查找。

在每次迭代中,计算中间元素的值,并与目标值进行比较,根据比较结果更新搜索范围。

2、代码示例

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int n = matrix.length, m = matrix[0].length; // 获取矩阵的行数和列数
        int low = 0, high = m * n - 1; // 初始化二分查找的搜索范围为一维数组的起始位置到结束位置
        while (low <= high) { // 当搜索范围有效时执行循环
            int mid = low + (high - low) / 2; // 计算中间元素的索引
            int x = matrix[mid / m][mid % m]; // 获取中间元素的值
            if (x > target) // 如果中间元素大于目标值
                high = mid - 1; // 更新搜索范围为左半部分
            else if (x < target) // 如果中间元素小于目标值
                low = mid + 1; // 更新搜索范围为右半部分
            else // 如果中间元素等于目标值
                return true; // 返回true
        }
        return false; // 若搜索范围无效,则返回false
    }
}

3、 时间复杂度分析:

设矩阵的行数为n,列数为m。在初始化后,二分查找的时间复杂度为O(log(nm))。
每次迭代中,都是在一维数组中进行操作,因此单次迭代的时间复杂度为O(1)。
整体的时间复杂度取决于二分查找的次数,即O(log(n
m))。

三、搜索二叉树法(思想类似):

1、思路分析

在二叉搜索树中,每个节点都有左子树和右子树,且左子树中的所有节点的值都小于当前节点的值,右子树中的所有节点的值都大于当前节点的值。因此,可以利用这个性质在BST中进行高效的搜索。这种思路称为二分搜索,每次搜索都可以将搜索范围缩小一半,因此搜索效率很高。虽然二维矩阵不是二叉搜索树,但可以利用类似的思想,在每一步中根据当前元素与目标值的大小关系,决定搜索范围的缩小方向。

2、具体步骤

从二维矩阵的右上角开始,利用矩阵的性质进行搜索:

①如果当前元素大于目标值,则目标值不可能在当前元素的列中,因此将列索引向左移动。

②如果当前元素小于目标值,则目标值不可能在当前元素的行中,因此将行索引向下移动。

③如果当前元素等于目标值,则找到目标值,返回true。

重复以上步骤直到找到目标值或者搜索范围超出矩阵边界。

3、代码示例

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int n = 0, m = matrix[0].length - 1;
        while(n < matrix.length && m >= 0){
            if(matrix[n][m] > target) m--;
            else if(matrix[n][m] < target) n++;
            else return true;
        }
        return false;
    }
}

4、 时间复杂度分析:

设矩阵的行数为n,列数为m。在最坏情况下,搜索范围会在矩阵的对角线上移动,因此时间复杂度为O(n + m)。

在每次迭代中,都是在矩阵中进行操作,因此单次迭代的时间复杂度为O(1)。

整体的时间复杂度为O(n + m)。

相关推荐
AI科技星2 分钟前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
Deepoch4 分钟前
数学模型驱动:Deepoc 低幻觉数学大模型助力发动机全周期智能优化
人工智能·算法·机器学习·deepoc·数学大模型·低幻觉
嘻嘻哈哈樱桃12 分钟前
牛客经典101题解题集--贪心算法+模拟
java·python·算法·贪心算法
AKDreamer_HeXY13 分钟前
QOJ 12255 - 36 Puzzle 题解
数据结构·c++·数学·算法·icpc·qoj
AI科技星22 分钟前
《全域数学》第一部 数术本源 第三卷 代数原本第14篇 附录二 猜想证明【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
Wect36 分钟前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
憨波个44 分钟前
【说话人日志】DOVER-Lap:overlap-aware diarization 输出融合算法
人工智能·深度学习·算法·音频·语音识别
叼烟扛炮1 小时前
C++第四讲:类和对象(下)
c++·算法·类和对象
Rabitebla1 小时前
vector 的骨架:三根指针、模板陷阱与迭代器失效的第一现场
开发语言·数据结构·c++·算法
代码不停1 小时前
BFS解决floodfill算法题目练习
算法·宽度优先