74. 搜索二维矩阵

news2024/7/4 5:47:06

74.搜索二维矩阵

    • 一、题目描述
    • 二、解题思路
      • 2.1 二分查找行
      • 2.2 二分查找列
    • 三、提交结果

一、题目描述

在这里插入图片描述

二、解题思路

采用两次二分的方式,第一次二分用于找到target在二维矩阵中的行标,第二次二分只需要对找到的行进行二分查找即可。

2.1 二分查找行

  1. 初始时left = 0,表示第0行
  2. right = martrix.length - 1,表示最后一行
  3. 寻找left和right的中间位置mid=left + ((right - left) >> 1)
  4. 令col = martrix[0].length,即col代表矩阵的列数
  5. 如果martrix[mid][col - 1] < target,说明当前mid行的最后一个元素比target小,那么target一定在下一行,调整left = mid + 1
  6. 如果martrix[mid][col - 1] > target,说明target要么在当前行,要么在前面的几行,此时可以再比较martrix[mid][0]和target的大小,如果比target大,那么target一定在前面几行,调整right = mid - 1
  7. 否则说明target就在当前行,返回mid,如果找不到合适的行,说明不存在target
private int findRow(int[][] matrix, int target) {
        int left = 0;
        int right = matrix.length - 1;
        int col = matrix[0].length - 1;

        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (matrix[mid][col] < target) {
                left = mid + 1;
            } else if (matrix[mid][0] > target) {
                right = mid - 1;
            } else {
                return mid;
            }
        }

        return -1;
    }

2.2 二分查找列

知道目标值所在行之后,只需要对该行的数据二分查找target即可

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int row = findRow(matrix, target);
        if (row == -1) {
            return false;
        }
        return find(matrix[row], target);
    }

    private boolean find(int[] row, int target) {
        int left = 0;
        int right = row.length - 1;

        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (row[mid] == target) {
                return true;
            } else if (row[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return false;
    }

    private int findRow(int[][] matrix, int target) {
        int left = 0;
        int right = matrix.length - 1;
        int col = matrix[0].length - 1;

        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (matrix[mid][col] < target) {
                left = mid + 1;
            } else if (matrix[mid][0] > target) {
                right = mid - 1;
            } else {
                return mid;
            }
        }

        return -1;
    }
}

时间复杂度分析,如果矩阵的行为m,列为n,那么二分搜索行时间复杂度是O(logm),确定行后,二分搜索该行元素时时间复杂度是O(logn),所以时间复杂度是O(logm + logn)

三、提交结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10.3 定制操作

文章目录向算法传递函数谓词排序算法lambda表达式可调用对象介绍lambdafind_if 和 find_each的介绍lambda的捕获和返回值捕获引用捕获隐式捕获可变lambda指定lambda返回的类型函数体参数绑定标准库bind函数占位符_n具体使用bind的参数使用bind重排参数顺序绑定引用参数向算法传…

svg动画图形绘制

先介绍下绘制图形的标签 1&#xff1a;线段&#xff1a;line 2&#xff1a;矩形&#xff1a;rect 3: 圆形&#xff1a;circle 4&#xff1a;多边形&#xff1a;polyline&#xff08;不会自动连接起点和终点&#xff09; 5: 多边形:polygon (会自动连接起点和终点&#xff09; v…

SAP FICO 理解统驭科目记账与特殊记账

统驭科目记账与特殊记账 【背景】 统驭科目通常分为三类&#xff1a;资产&#xff08;A&#xff09;、客户&#xff08;D&#xff09;和供应商&#xff08;K&#xff09;&#xff0c;在创建会计科目时可在”控制数据“选项卡下进行选择。 在创建客户/供应商主数据的时候&#…

Vue插槽Slot的使用

1、认识插槽Slot 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的div、span等等这些…

【零基础】学python数据结构与算法笔记15-欧几里得、RSA

文章目录前言95.欧几里得算法96.RSA算法介绍97.RSA算法测试98.算法课程总结总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b站学习链接 95.欧几里得算法 求最大公约数 欧几里得算法&#xff1a;gcd(a,b) gcd(b,a mod b) #mod取余 例&#xff1a…

04.自定义类型:结构体

1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag { member-list;//成员列表 }variable-list;//变量列表 EG: 描述一位学生&#xff1a; struct Stu {char name[…

Comparable+Comparator+Cloneable接口

文章目录ComparableComparatorCloneable浅拷贝深拷贝Comparable 当我们需要对一个自己写的类进行排序(Collections.sort和Arrays.sort)的时候&#xff0c;,就要使用到Comparable接口。 该接口中有一个compareTo方法&#xff0c;该方法其实就是一比较规则。 public interface…

货币银行学

建立大脑知识库 外汇储备不宜太高&#xff0c;2022年是3万亿。 美元贬值&#xff0c;大宗商品会更贵。 大宗商品 [1] &#xff08;Commodities&#xff09;是指可进入流通领域&#xff0c;但非零售环节&#xff0c;具有商品属性并用于工农业生产与消费使用的大批量买卖的物质商…

Oracle Id生成算法 —— 雪花算法

背景 近几日&#xff0c;被主键ID生成折磨的不太行&#xff0c;于是就在寻找一种合适的主键生成策略&#xff0c;选择一种合适的主键生成策略&#xff0c;可以大大降低主键ID的维护成本。 主键ID生成方法 最常用的4种主键ID生成方法 UUID&#xff1a;全局唯一性&#xff0c…

【框架】Spring

1、IOC 1、自动化配置 xml文件 注册bean 属性注入&#xff1a;setter&#xff0c;构造方法&#xff0c;p命名空间&#xff0c;外部注入 复杂属性&#xff1a;对象ref&#xff0c;数组array&#xff0c;list&#xff0c;map 依赖注入&#xff1a;ctx.getBean()Java配置类 Conf…

InterruptedException异常解析

Either re-interrupt this method or rethrow the “InterruptedException”. 请重新中断此方法或重新引发“InterruptedException”。 文章目录问题描述问题解析sonar检测提示规则解决方案问题描述 public void run () {try {while (true) {// do stuff}}catch (InterruptedE…

webgl变换矩阵理论详解

文章目录前言矩阵运算矩阵加减矩阵数乘矩阵乘矩阵矩阵转置逆矩阵正交矩阵矩阵变换的一般规则行主序和列主序行向量和列向量复杂变换时的顺序变换矩阵进行图形变换uniform传递矩阵平移缩放旋转组合变换实例总结前言 在webgl中将图形进行平移、旋转、缩放等操作时可以在着色器中…

11.1 使用关联容器

文章目录关联容器的类型使用map使用set关联容器中元素是按关键字保存和访问的&#xff0c;支持高效关键字查找和访问。顺序容器中元素是按他们在容器中的位置保存访问的。关联容器有两个主要类型&#xff1a;set和map。 set&#xff1a;每个元素包含一个关键字&#xff0c;想知…

OPC实践:通过 python-docx 读取 docx 文档

概述 本文记录下列命令执行的过程&#xff0c;通过对过程中的关键步骤进行记录&#xff0c;掌握 python-docx 库中 opc 与 parts 模块的源码、以及加深对 OPC 的理解。 import docx# fp 为 docx 文件路径&#xff0c; docx 包含一个 hello 字符串、一张 jepg 图片及一个表格…

<Python的列表和元组>——《Python》

目录 1.列表 1.1 列表的概念 1.2 创建列表 1.3 访问下标 1.4 切片操作 1.5 遍历列表元素 1.6 新增元素 1.7 查找元素 1.8 删除元素 1.9 连接列表 2. 元组 1.列表 1.1 列表的概念 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少,…

初识 Bootstrap(前端开发框架)

初识 Bootstrap&#xff08;前端开发框架&#xff09;参考Bootstrap特点获取目录结构jQuery 与 Popper准备工作包含 jQuery 与 Poppermetabox-sizing基本模板无注释版本注释版本参考 项目描述Bootstrap 官方教程https://getbootstrap.net/docs/getting-started/introduction/百…

字节青训前端笔记 | HTTP 使用指南

本节课介绍 Http 协议的基本定义和特点&#xff0c;在此基础上&#xff0c;对于 Http 协议的发展历程及报文结构展开进一步分析。 从输入字符串到打开网页 输入地址浏览器处理输入信息浏览器发请求到达服务器服务器返回信息浏览器读取响应信息浏览器渲染页面加载完成 什么是…

KVM虚拟化简介 | 初识

目录 1、kvm架构 2、架构解析 3、kvm和qemu的作用 1、kvm架构 2、架构解析 从rhel6开始使用&#xff0c;红帽公司直接把KVM的模块做成了内核的一部分。xen用在rhel6之前的企业版中默认内核不支持&#xff0c;需要重新安装带xen功能的内核KVM 针对运行在x86 硬件上的、驻留在内…

配置 Git 连接 GitHub

文章目录0.安装 Git1.注册 GitHub 账号2.配置 Git 的用户名和邮箱3.为本机生成 SSH 密钥对4.将公钥拷贝到 GitHub 上5.测试0.安装 Git Git 官网链接&#xff1a;https://git-scm.com/ Git 官网下载链接&#xff1a;https://git-scm.com/downloads 1.注册 GitHub 账号 GitHu…

蓝桥杯STM32G431RBT6学习——定时器PWM输出

蓝桥杯STM32G431RBT6学习——定时器PWM输出 前言 PWM波输出作为定时器的一个常用功能&#xff0c;也属于高频的考点。从数据手册的定时器解析可以了解到&#xff08;上篇描述&#xff09;&#xff1a;除了基本定时器&#xff08;TIM6、7&#xff09;外&#xff0c;其他所有定…