大厂面试真题题解:搜索二维矩阵

简介: 大厂面试真题题解:搜索二维矩阵

写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:

  • 每行中的整数从左到右是排序的。
  • 每行的第一个数大于上一行的最后一个整数。

在线评测地址:领扣题库官网

样例 1:

        输入: [[5]],2
        输出: false
        
        样例解释: 
  没有包含,返回false。

样例 2:

        输入:  
[
  [1, 3, 5, 7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
],3
        输出: true
        
        样例解释: 
        包含则返回true。

解题思路:
题目提到,给定的数组已经排序,若是一个一维数组,直接一次二分查找即可。现在题目给了一个二维数组,那么处理一下数组的下标,仍然按照一维数组二分即可。
二分查找常用于查找有序数组中目标数target的位置,用left和right记录target所在的区间端点,每次将区间的中间位置值和target作比较,然后移动区间端点。
算法流程:

  • 将数组matrixi下标转换为 i*col + j, 问题即转换为一维数组二分查找问题
  • 将区间赋值为整个数组区间(left = 0, right = n*m - 1),取中间位置mid
  • 若a[mid] < target,则将区间缩小到原区间的右区间(left = mid + 1)
  • 若a[mid] > target,则将区间缩小至原区间的左区间(right = mid)
  • 若a[mid] = target,返回true
  • 当left >= right 时,若a[right] = target则返回true, 否则返回false
    复杂度分析:
  • 时间复杂度:O(log(nm))
  • 即将二维数组看作一个n*m大小的一维数组,二分查找值。
  • 空间复杂度:O(1)
  • 查找不需要开辟新的空间,只需在原数组基础上进行查找即可
    代码:
public class Solution {
    /**
     * @param matrix, a list of lists of integers
     * @param target, an integer
     * @return a boolean, indicate whether matrix contains target
     */
    public boolean searchMatrix(int[][] matrix, int target) {
        int n = matrix.length;
        int col = matrix[0].length;
        int left = 0, right = n*col - 1;
        
        while(left < right){
            int mid = (right + left) / 2;
            if(matrix[mid/col][mid%col] == target){
                return true;
            }
            else if(matrix[mid/col][mid%col] > target){
                right = mid;
            }
            else{
                left = mid + 1;
            }
        }
        
        if(matrix[right/col][right%col] == target){
            return true;
        }
        
        return false;
    }
}

更多题解参考:九章官网Solution

相关文章
|
6月前
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
【一刷《剑指Offer》】面试题 20:顺时针打印矩阵
|
6月前
|
测试技术
【一刷《剑指Offer》】面试题 9:斐波那契数列(扩展:青蛙跳台阶、矩阵覆盖)
【一刷《剑指Offer》】面试题 9:斐波那契数列(扩展:青蛙跳台阶、矩阵覆盖)
|
6月前
|
机器学习/深度学习 人工智能 算法
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
|
6月前
|
算法 Java C++
二维矩阵搜索问题——小米面试题
二维矩阵搜索问题——小米面试题
35 0
|
6月前
|
算法
面试题 01.08:零矩阵
面试题 01.08:零矩阵
25 0
剑指Offer - 面试题12:矩阵中的路径
剑指Offer - 面试题12:矩阵中的路径
74 0
|
算法
回溯法——面试题矩阵中的路径(一)
回溯法介绍 回溯法应用(实例化) 回溯法介绍 1.1 回溯法是蛮力法的升级版,它从解决问题每一步的所有可能选项里系统的选择一个可行的解决方案。 1.2 回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项。当我们在某一步做出一个选择时,就进到下一步了,如果不符合题目条件,就回溯到原来的步骤进行新的选择,如果这步的选择还没有符合条件的直到选到符合题目条件的选项为止。如果都不符合的话,就会再回溯到上一步,然后进入再进行新的选择,就这样重复选择,直到到达最终的状态。 1.3 通常回溯法算法适合用递归实现代码,当我们到达某一个节点时,尝试所有可能的选项并在满足条件的前提下递归地抵达下一个节点。
104 0
|
Serverless C语言 索引
华为面试C语言真题(二)
华为面试C语言真题( 二)
301 1
华为面试C语言真题(二)
|
安全 测试技术 Python
软件测试面试题及答案,这个题库有3千多道最新面试真题可以刷
相信对于很多软件测试新手来说,技术项目的面试是十分让人头疼的,生怕没回答得好,就会跟这个offer失之交臂
202 0
|
设计模式 缓存 算法
腾讯Java高级岗180道面试真题,面试大厂拿45Koffer没问题!
一、数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度。 · 用Java写一个冒泡排序算法 · 描述一下链式存储结构。 · 如何遍历一棵二叉树? · 倒排一个LinkedList。 · 用Java写一个递归遍历目录下面的所有文件