leetcode 第74题 搜索二维矩阵

2023-05-16

题目

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

示例1

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

思路

给的数组其实是整体有序的,行内升序,列内升序,行与行之间也是升序。

其实一开始直接想到的就是先确定target是属于哪个行,也就是从第一列中查找target;然后在找到的行中,再继续查找target。

要想进行高效查找的话,那就是二分查找了。

另外,其实整个数据全局有序,也可以进行全局的二分搜索。

先查列,再查行

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int line = -1;
        for (int i = 0; i < matrix.length; i++) {
            if (target >= matrix[i][0]) {
                line = i;
            } else {
                break;
            }
        }

        if (line == -1) {
            return false;
        }

        for (int j = 0; j < matrix[line].length; j++) {
            if (target == matrix[line][j]) {
                return true;
            } else if (target < matrix[line][j]) {
                return false;
            }
        }
        return false;
    }
}

因为是线性查找,没有用到二分搜索,所以时间复杂度是O(m+n)

二分法

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix.length < 1 || matrix[0].length < 1 || target < matrix[0][0]) return false;

        int lineLow = 0, lineHigh = matrix.length - 1;
        while (lineLow < lineHigh) {
            int lineMid = (lineHigh + lineLow + 1) / 2;
            if (matrix[lineMid][0] == target) {
                return true;
            } else if (matrix[lineMid][0] > target) {
                lineHigh = lineMid - 1;
            } else {
                lineLow = lineMid;
            }
        }

        int rowLow = 0, rowHigh = matrix[lineLow].length - 1;
        while (rowLow <= rowHigh) {
            int rowMid = (rowLow + rowHigh) / 2;
            if (target == matrix[lineLow][rowMid]) {
                return true;
            } else if (target > matrix[lineLow][rowMid]) {
                rowLow = rowMid + 1;
            } else {
                rowHigh = rowMid -1;
            }
        }
        return false;
    }
}

时间复杂度:O(log m + log n) = O (log mn)

全局二分

这个可以参考官方解法
时间复杂度:O (log mn)

边界值问题

其实这个题的思路并不难,但是做这种题目,总是对于边界值、终止条件和演进方向不能有很清晰的思路,做一下经验总结。

首先,我们会先拿到两端的索引,然后计算中间索引,对中间索引指向的内容进行判断。

  1. 中间索引的计算方法
    上面的代码,使用的是(low + high) / 2,这个方法其实不是很好,如果两个数字都很大的话,是有可能会出现越界的。
    最好的方法是 low + (high - low) / 2

  2. 中间索引的偏向问题
    使用 low + (high - low) /2 的计算方法,其实算出来的mid值会偏向low,如果我们想让high侧的内容优先进行判断,应该采用:
    low + (high - low + 1) / 2

  3. 终止条件
    终止条件需要考虑的是low是否应该等于high。

    如果循环条件是low<high, 也就是终止条件为low>=high。终止条件其实是跟中间索引的计算方法和计算目标有关系的。如果是low>=high进行终止的话,其实是有可能会存在最终low指向的位置没有进行校验的。

    如果要确保所有的索引位置都进行过校验,循环条件应该设置为low<=high,这样终止条件就是low>high。

    感觉还是没有论证清楚,后续再补充。当前的经验是:终止条件需要考虑相等的情况,最终的返回结果需要是符合预期的。

  4. 指针的演进方向
    比较完mid指针后,low和high指针需要考虑是赋mid的值,还是mid±1
    这个其实还是比较好确定的,就是mid这个值在判断完之后,如果已经不是符合预期的数据,那就应该使用±1,否则就不能±1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 第74题 搜索二维矩阵 的相关文章

  • windows下pycharm中安装和使用tensorflow

    配置 xff1a win7 43 cuda8 0 43 vs2015 43 cudnn6 0 43 python3 5 43 tensorflow1 4 43 pycharm 大体思路是 xff1a 先安装vs2015 再将cudnn6 0
  • 程序员常用网站

    1J2me 开发网 http www j2medev com bbs index asp 2J2me 社区 http www j2meforums com forum 3csdn http www csdn net 4Vc 知识库 http

随机推荐

  • MATLAB加速技巧

    1 向量化 目的 xff1a 减少for循环的使用 96 nonVecl m clear all tic A 61 0 0 000001 10 B 61 0 0 000001 10 Z 61 zeros size A y 61 0 for
  • Linux 开启VNCSERVER

    一般 xff0c 通过ssh来远程连接linux服务器 xff0c 进行命令操作 但是没有图形化界面确实有些不太方便 xff0c 因此可以通过ssh来启动vnc ssh和vncserver以及vnc软件的安装这里就不再介绍 首先 xff0c
  • 从输入URL到网页显示,期间发生了什么(详解)

    从输入URL到网页显示 xff0c 期间都发生了什么 解析URL操作系统协议栈TCP封装IP封装MAC封装 网卡交换机路由器到达服务器 Internet上的每一个网页都具有一个唯一的名称标识 xff0c 通常称之为URL xff08 Uni
  • KuberSphere安装harbor的配置文件解读

    span class token comment 这个配置文件 xff0c 其实就是上面部分是harbor配置 xff0c 下面都是自定义的配置需要的镜像配置 span span class token comment 综合下来 xff0c
  • SLAM综述阅读笔记六:基于图像语义的SLAM调研:移动机器人自主导航面向应用的解决方案 2020

    转自 论文阅读 A survey of image semantics based visual simultaneous localization and mapping 语义视觉SLAM综述 知乎 A survey of image s
  • keil5怎么打开keil4工程,以及keil5怎么打包成keil4工程

    如何用keil5打开keil4工程 在keil5的环境下 xff0c 打开keil4的工程文件 xff0c 会弹出下图所示窗口 xff1a 一般选择第二种方法 xff1a Install Legacy Support 下载keil4的支持包
  • window 下docker Desktop 安装更新wsl 2

    报错描述 我们安装Docker Desktop的时候 他会问我们是否需要使用WSL2 基于Windows的Linux子系统 如果我们不适用 就会使用Hyper v虚拟机运行 不过相比于虚拟机 子系统在性能方面更加出色 在我们选择使用WSL2
  • GNU sed 多行合并成一行

    只适用于GNU 的sed工具 xff08 linux版本 xff09 xff0c 其他版本的不兼容 mac下可以使用brew intsall gsed 安装gnu sed 比如 xff1a 每2行合并成一行 sed n 39 1h 1 H
  • centos7防火墙(firewalld、iptables)

    一 firewalld和iptables netfilter iptables是集成在linux2 4 x版本内核中的包过滤防火墙系统 该框架可以实现数据包过滤 xff0c 网络地址转换以及数据包管理功能 linux中的防火墙系统包括两个部
  • 51单片机-宏晶STC程序调试、烧录、硬仿真

    内容包括STC单片机内部硬件介绍 xff08 寄存器 xff09 与程序的调试 硬仿真 xff0c STC15F硬仿真及其错误处理 xff0c MCS 51仿真介绍 xff0c 全自动下载介绍等 紫色文字是超链接 xff0c 点击自动跳转至
  • 12864液晶显示原理(C程序)

    内容包括液晶屏常识 xff0c 12864液晶显示原理 xff0c 点阵型LCD文字与图形软硬件设计实例 紫色文字是超链接 xff0c 点击自动跳转至相关博文 持续更新 xff0c 原创不易 xff01 目录 xff1a 一 12864液晶
  • 0x00000040指定的网络名不再可用怎么办?

    Win11提示打印机错误0x00000040指定的网络名不再可用怎么办 xff1f 有部分Win11用户遇到了操作无法完成 xff08 错误 0X00000040 xff09 xff0c 指定的网络名不再可用的问题 xff0c 小编为大家带
  • vmware 导出导入

    vmware 导出导入 如果要换电脑 xff0c 虚拟机可以选择导出OVF文件 注意导出时有3个文件 ovf vmdk iso 三个导入时必不可缺 xff0c mf 文件是否需要没有验证
  • 2_项目都有哪些分支,分支名是什么,每个分支代表什么?

    master 主分支用来发布 dev 日常开发用的分支 test 测试用的分支 1 master 主分支用来发布 2 dev 日常开发用的分支 3 test 测试用的分支
  • zookeeper的选举机制是如何应对脑裂的

    本来想写 zookeeper的选举机制 xff0c 但是选举机制的具体流程还没研究 xff0c 只是知道了选举机制是如何避免脑裂的 xff0c 就先写个小部分 xff0c 等后面扩展 在网上看了好多文章 xff0c 都在介绍zookeepe
  • sql查询成绩表中每一科成绩最高的分数以及这个学生的名字,学科名

    前段时间面试的时候碰到这样一个面试题 xff0c 因为很久没接触sql竟然没写出来 如图有这样一张成绩表 xff1a 首先要理解group by 含义 xff1a Group By 从字面意义上理解就是根据 By 指定的规则对数据进行分组
  • flink slotSharingGroup 在本地调试的时候可能会导致程序卡住

    现象就是一个加了slotSharingGroup的程序 xff0c 在本地调试的时候可能数据流不流动 xff0c 把slotSharingGroup去掉就可以了 原因未知 xff0c hold 有路过了解的朋友可以给说一下 xff0c 或者
  • Flink的classLoader加载机制(推测)-- 记一次程序问题中的探索

    项目中需要用flink去加载c 43 43 的so文件 flink任务中如果有加载so的逻辑 xff0c 当任务挂掉之后 xff0c 再次重启的时候会报 Native Library xxx is being loaded in anoth
  • flink的侧输出(sideoutput)和OutputTag

    背景 用flink做数据处理的时候 xff0c 我们经常会想要将数据分成几类处理 xff0c 或者有一批特殊数据需要单独处理 但是我们又想复用同一个流式任务 xff0c 避免重复处理数据 这种需求 xff0c 使用sideoutput完美解
  • leetcode 第74题 搜索二维矩阵

    题目 编写一个高效的算法来判断 m x n 矩阵中 xff0c 是否存在一个目标值 该矩阵具有如下特性 xff1a 每行中的整数从左到右按升序排列 每行的第一个整数大于前一行的最后一个整数 示例1 输入 xff1a matrix 61 1