LeetCode[中等] 74.搜索二维矩阵

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

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

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

cs 复制代码
public class Solution {
    public bool SearchMatrix(int[][] matrix, int target) {
        int m = matrix.Length, n = matrix[0].Length;
        int low = 0, high = m * n - 1;
        while(low <= high)
        {
            int mid = low + (high - low) / 2;
            int row = mid / n , column = mid % n;
            if(matrix[row][column] == target)
                return true;
            else if(matrix[row][column] > target)
                high = mid -1;
            else
                low = mid + 1;
        }
        return false;
    }
}

思路:m 行 n 列的矩阵可以转换成长度为 mn 的升序数组。矩阵中的每个位置可以和升序数组中的下标转换:

  • 当 0≤i<m 且 0≤j<n 时,矩阵的第 i 行第 j 列等价于升序数组的下标 i×n+j;

  • 当 0≤index<mn 时,升序数组的下标 index 等价于矩阵的第 ⌊nindex​⌋ 行第 index mod n 列。

为了判断矩阵中是否存在目标值,可以在矩阵转换成的升序数组中二分查找。

复杂度分析

代码

测试用例

测试结果

测试结果

全部题解

  1. 搜索二维矩阵

Storm

关注

242

2022.06.11

发布于 上海

数组

二分查找

矩阵

C

6+

解法

思路和算法

由于给定的矩阵满足每行升序排序,且每行的第一个整数大于前一行的最后一个整数,因此如果将矩阵的每一行拼接到前一行的末尾,可以得到一个升序数组,m 行 n 列的矩阵可以转换成长度为 mn 的升序数组。矩阵中的每个位置可以和升序数组中的下标转换:

  • 当 0≤i<m 且 0≤j<n 时,矩阵的第 i 行第 j 列等价于升序数组的下标 i×n+j;

  • 当 0≤index<mn 时,升序数组的下标 index 等价于矩阵的第 ⌊nindex​⌋ 行第 indexmodn 列。

为了判断矩阵中是否存在目标值,可以在矩阵转换成的升序数组中二分查找。

用 low 和 high 分别表示二分查找的下标范围的下界和上界,初始时 low=0,high=mn−1。每次查找时,取 mid 为 low 和 high 的平均数向下取整,计算下标 mid 对应的矩阵行下标和列下标,判断矩阵中的相应位置的数和目标值的大小关系,调整查找的下标范围。

  • 如果矩阵中相应位置的数等于 target,则找到目标值,返回 true。

  • 如果矩阵中相应位置的数大于 target,则如果目标值存在,其下标一定小于 mid,因此在下标范围 [low,mid−1] 中继续查找。

  • 如果矩阵中相应位置的数小于 target,则如果目标值存在,其下标一定大于 mid,因此在下标范围 [mid+1,high] 中继续查找。

如果查找的过程中出现 low>high,则目标值不存在,返回 false。

代码

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

复杂度分析

  • 时间复杂度:O(log(mn)),其中 m 和 n 分别是矩阵 matrix 的行数和列数。矩阵中的元素个数是 mn,二分查找的次数是 O(log(mn)),每次查找的时间是 O(1),时间复杂度是 O(log(mn))。

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

相关推荐
XH华1 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_2 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子2 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡2 小时前
滑动窗口 + 算法复习
数据结构·算法
Lenyiin2 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码2 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
scan7242 小时前
LILAC采样算法
人工智能·算法·机器学习
菌菌的快乐生活3 小时前
理解支持向量机
算法·机器学习·支持向量机
大山同学3 小时前
第三章线性判别函数(二)
线性代数·算法·机器学习