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

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

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

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

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 列。

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

复杂度分析

代码

测试用例

测试结果

测试结果

全部题解

74. 搜索二维矩阵

Storm

Guardian

关注

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。

代码

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)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工控一体机在高精度玻璃检测机中的应用

工控一体机在高精度玻璃检测机中的应用主要体现在以下几个方面&#xff1a; 一、数据采集与处理 工控一体机作为工业控制计算机&#xff0c;能够高效采集来自高精度玻璃检测机中各种传感器和执行器的数据。这些数据包括但不限于玻璃表面的图像信息、厚度、温度、光学特性等。…

【笔记】第二节 轧制、热处理和焊接工艺

2.2 钢轨的轧制工艺 坯料进厂按标准验收, 然后装加热炉加热, 加热好的钢坯经高压水除鳞后进行轧制。轧出的钢轨经锯切、打印到中央冷床冷却, 然后装缓冷坑进行缓冷。缓冷后的钢轨进行矫直、轨端加工和端头淬火。钢轨入库前逐根进行探伤和外观检查。 钢轨的轧制 #mermaid-svg-…

无人机集群路径规划:麻雀搜索算法(Sparrow Search Algorithm, SSA)​求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化…

老年人养生之道:岁月静好,健康常伴

老年人养生之道&#xff1a;岁月静好&#xff0c;健康常伴 随着年岁的增长&#xff0c;老年人更需注重养生&#xff0c;以维持身心的和谐与健康&#xff0c;享受幸福晚年。养生不仅是一种生活态度&#xff0c;更是一种智慧的选择&#xff0c;它涵盖了饮食、运动、心理、社交等…

Linux 防火墙:iptables (二)

文章目录 SNAT 原理与应用SNAT 应用环境SNAT 原理SNAT 转换前提条件SNAT 格式SNAT 转换规则配置 DNAT 原理与应用DNAT 应用环境DNAT 原理DNAT 转换前提条件DNAT 格式DNAT 转换规则配置 iptables 规则的备份和还原导出&#xff08;备份&#xff09;所有表的规则导入&#xff08;…

您可能一直在寻找的 10 个非常有用的前端库

文章目录 前言正文1.radash2.dayjs3.driver4.formkit/drag-and-drop5.logicflow6.ProgressBar7.tesseract8.zxcvbn9.sunshine-track10.lottie 前言 前端开发中&#xff0c;总有一些重复性的工作让我们疲于奔命。为了提高开发效率&#xff0c;我们精心挑选了10个功能强大、易于…

打开Anaconda Navigator没反应,卡在Initializing...的解决方案

一、问题描述 打开Anaconda Navigator时&#xff0c;一直卡在Initializing...没反应&#xff0c;如下图所示&#xff1a; 二、解决方案 进入Anaconda安装目录下找到并打开文件夹attribution&#xff08;笔者Anaconda安装目录在D盘下&#xff0c;读者可自行查找自己安装目录中…

BUUCTF逆向wp [WUSTCTF2020]Cr0ssfun

第一步 查壳&#xff0c;本题是64位&#xff0c;无壳。 第二步 查看主函数&#xff0c;点开看主函数&#xff0c;没什么东西。 左边表里面看到好几个i开头的函数&#xff08;红色方框里面&#xff09;&#xff0c;点开看后每个函数的最后末尾&#xff08;图中红色椭圆圈那里&a…

Streamlit:使用 Python 快速开发 Web 应用

一、简单介绍 Streamlit 是一个开源 Python 库&#xff0c;官网地址&#xff1a; https://streamlit.io/http://StreamlitStreamlit 是一个开源的 Python 框架&#xff0c;旨在为数据科学家和 后端工程师们提供只需几行代码即可创建动态数据应用的功能。 让没有任何前端基础…

梯形区域分解实现避障路径规划全覆盖路径规划

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言&#xff08;1&#xff09;功能&#xff08;2&#xff09;算法&#xff08;3&#xff09;参考链接&#xff08;4&#xff09;…

go语言后端开发学习(七)——如何在gin框架中集成限流中间件

一.什么是限流 限流又称为流量控制&#xff08;流控&#xff09;&#xff0c;通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景&#xff0c;比如&#xff1a;某景区限制每日进入景区的游客数量为8万人&#xff1b;沙河地铁站早高峰通过站外排队逐一放行的…

【STM32】独立看门狗(IWDG)原理详解及编程实践(上)

本篇文章是对STM32单片机“独立看门狗&#xff08;IWDG&#xff09;”的原理进行讲解。希望我的分享对你有所帮助&#xff01; 目录 一、什么是独立看门狗 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;、独立看门狗的原理 &#xff08;三&#xff09;、具体操…

51.字符串比较实例-用户登录

//已知正确的用户名和密码&#xff0c;请用程序实现模拟用户登录 //总共三次机会&#xff0c;登录之后给出相应的提示 import java.util.Scanner;public class 登录 {public static void main(String[] args) {//1.定义两个变量&#xff0c;记录正确的用户名和密码String righ…

springboot+redis+缓存

整合 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 连接redis&#xff0c;配置yml文件 主机 端口号 数据库是哪一个 密码 配置类 p…

滑动窗口算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 目录 滑动窗口算法的简介 209. 长度最小的子数组 3.无重复字符的最长子串 1004. 最大连续1的个数III 1658. 将减到0的最小…

基于python上门维修预约服务数据分析系统

目录 技术栈和环境说明解决的思路具体实现截图python语言框架介绍技术路线性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求&#xff0c;本系统采用运用较为广…

Linux相关概念和重要知识点(5)(权限的修改、时间属性)

1.权限的修改 &#xff08;1&#xff09;提权行为 普通用户是会受到权限的限制&#xff0c;但root账户无视一切权限限制&#xff0c;因此当我们要获取更高的权限&#xff0c;有一种办法就是将自己变成root或者短暂拥有和root一样的权力。 普通用户 -> root &#xff1a;s…

robomimic应用教程(一)——模型训练

Robomimic使用集中式配置系统来指定所有级别的(超)参数 本文介绍了配置&#xff08;推荐&#xff09;和启动训练运行的两种方法 目录 一、使用config json&#xff08;推荐&#xff09; 二、在代码中构造一个配置对象 三、查看运行结果 1. 实验结果会存在一个固定文件夹中…

地信、测绘、遥感、地质相关岗位招聘汇总

3s等相关专业25秋招&提前批招聘信息 该岗位信息表&#xff0c;覆盖全国各大省市&#xff0c;招聘岗位主要针对地信、测绘、地质、遥感、城规等专业。 1800WebGIS开发岗位汇总表 该信息表&#xff0c;主要是WebGIS开发岗为主&#xff0c;岗位要求熟悉熟悉Openlayers&#…

Python编码系列—Python桥接模式:连接抽象与实现的桥梁

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…