【Leetcode 热题 100】74. 搜索二维矩阵

问题背景

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。
    给你一个整数 t a r g e t target target,如果 t a r g e t target target 在矩阵中,返回 t r u e true true;否则,返回 f a l s e false false。

数据约束

  • m = m a t r i x . l e n g t h m = matrix.length m=matrix.length
  • n = m a t r i x [ i ] . l e n g t h n = matrix[i].length n=matrix[i].length
  • 1 ≤ m , n ≤ 100 1 \le m, n \le 100 1≤m,n≤100
  • − 1 0 4 ≤ m a t r i x [ i ] [ j ] , t a r g e t ≤ 1 0 4 -10 ^ 4 \le matrix[i][j], target \le 10 ^ 4 −104≤matrix[i][j],target≤104

解题过程

题目保证整个矩阵中的元素从上到下从左到右依次递增,也就是可以展开成一个递增的一维数组,可以用下标映射的方式,在这个虚拟的一维矩阵中进行二分搜索,时间复杂度为 O ( l o g ( m n ) ) O(log(mn)) O(log(mn))。

还可以用排除法,参考 搜索二维矩阵 II。从矩阵的右上角开始,每次比较能够去掉一行或一列,相当于查找抽象的二叉搜索树,时间复杂度大致在 O ( m + n ) O(m + n) O(m+n) 这个量级。

具体实现

整体二分

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

查找抽象二叉搜索树

java 复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int i = 0;
        int j = matrix[0].length - 1;
        while(i < matrix.length && j >= 0) {
            int cur = matrix[i][j];
            if(cur == target) {
                return true;
            }
            if(cur < target) {
                i++;
            } else {
                j--;
            }
        }
        return false;
    }
}
相关推荐
myprogramc7 分钟前
十大排序算法
数据结构·算法·排序算法
记得早睡~11 分钟前
leetcode150-逆波兰表达式求值
javascript·算法·leetcode
qy发大财13 分钟前
跳跃游戏(力扣55)
算法·leetcode
BingLin-Liu16 分钟前
蓝桥杯备考:搜索算法之排列问题
算法·职场和发展·蓝桥杯
计算机小白一个19 分钟前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
孤雪心殇20 分钟前
简单易懂,解析Go语言中的Map
开发语言·数据结构·后端·golang·go
curemoon1 小时前
理解都远正态分布中指数项的精度矩阵(协方差逆矩阵)
人工智能·算法·矩阵
柃歌1 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
柃歌1 小时前
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
java·数据结构·笔记·学习·算法
干炒 牛河2 小时前
数据结构:双链表list
数据结构·list