74. 搜索二维矩阵

74. 搜索二维矩阵

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

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

示例 1:

复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -10^4 <= matrix[i][j], target <= 10^4

二分思路:

  1. 二分查找:使用 leftright 两个指针表示搜索区间,初始值分别为 0 和 m * n - 1

  2. 在循环中,计算中间索引 mid。然后使用公式 x = mid / ny = mid % n++将一维索引转换回二维坐标。++

  3. 比较矩阵中位置 (x, y) 的值与目标值 target 的大小关系:

    • 如果相等,说明找到了目标值,返回 true
    • 如果矩阵中的值小于目标值,说明目标值在右半部分,将 left 指针移到 mid + 1
    • 如果矩阵中的值大于目标值,说明目标值在左半部分,将 right 指针移到 mid - 1
  4. 如果在循环结束时仍未找到目标值,说明不存在,返回 false

关键点是进行二分查找。这样可以在 O(log(m*n)) 的时间复杂度内完成搜索,相比直接遍历整个矩阵的方法效率要高。利用了矩阵是有序排列的这一特性,通过二分查找的方式快速定位目标值的位置,从而提高了搜索效率。

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;

        if (target < matrix[0][0] || target > matrix[m - 1][n - 1]) {
            return false;
        }

        int left = 0, right = m * n - 1;
        int mid = 0;
        while (left <= right) {
            mid = (left + right) / 2;
            int x = mid / n;
            int y = mid % n;

            if (matrix[x][y] == target) {
                return true;
            } else if (matrix[x][y] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return false;
    }
}
相关推荐
luj_17684 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
我命由我123454 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
mCell5 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
咖啡八杯5 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
AIGS0016 小时前
企业AI落地的关键认知:向量空间JBoltAI的本体语义平台
java·人工智能·人工智能ai大模型应用
KaMeidebaby6 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_17687 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
tmlx3I0817 小时前
高光谱拼接算法(六)RANSAC 误匹配剔除
人工智能·算法·机器学习
不相心 -w-8 小时前
基础-滑动窗口-(定长 | 不定长)
算法
醉城夜风~8 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法