剑指 Offer 04. 二维数组中的查找

题目描述

        在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路

注意每一行和每一列都是非递减的顺序,也就是说第[i][j]个位置数值小于等于[i+1][j]和[i][j+1]下标的值。

方法一:二分搜索

        由于每行和每列都是非递减的,我们可以使用二分搜索来加速搜索过程。可以选择从右上角开始,对当前元素与目标值进行比较,如果当前元素比目标值大,就向左移动一列,否则向下移动一行。重复这个过程,直到找到目标值或者搜索范围为空。

        为什么选择从右上角/左下角开始?以右上角举例,右上角的元素是当前行的最大元素,同时是列的最小元素,如果目标比右上角元素大则一定在当前行下方,向下移动;如果目标比右上角元素小则一定在当前行左方,向左移动。这样根据当前元素与目标值的大小关系来缩小搜索范围。        

        这个方法的时间复杂度是 O(nlogm) 或 O(mlogn),具体取决于数组的大小和目标值的位置;空间复杂度为 O(1)

方法二:分治法

将二维数组分成四个子问题,然后递归地解决它们。具体步骤如下:

  1. 找到数组的中心元素(例如,中间行的中间列),将数组分成四个子数组:左上、右上、左下和右下。

  2. 检查中心元素与目标值的大小关系,如果中心元素等于目标值,返回 true。

  3. 如果中心元素比目标值大,递归地在左上和左下子数组中查找目标值。

  4. 如果中心元素比目标值小,递归地在右上和右下子数组中查找目标值。

这个方法的时间复杂度取决于递归的深度,通常为 O(log(n+m));分治法在递归过程中会产生一些额外的递归调用栈,因此其空间复杂度取决于递归的深度。在最坏情况下,递归深度可能达到数组的行数和列数的较大者,因此空间复杂度可以达到 O(n) 或 O(m),其中 n 是数组的行数,m 是数组的列数。

代码及结果

二分法

bool Solution::findNumberIn2DArray(std::vector<std::vector<int>>& matrix, int target)
{if (matrix.empty())return false;int rows = matrix.size();int cols = matrix[0].size();int row = 0;int col = cols - 1;while (row < rows && col >= 0){if (matrix[row][col] == target)return true;else if (matrix[row][col] < target)++row;else--col;}return false;
}

 

分治法

bool Solution::search(std::vector<std::vector<int>>& matrix, int target, int row1, int col1, int row2, int col2)
{if (row1 > row2 || col1 > col2) {return false; // 子矩阵为空,直接返回false}int midRow = (row1 + row2) / 2;int midCol = (col1 + col2) / 2;int midValue = matrix[midRow][midCol];if (midValue == target) {return true; // 找到目标值}else if (midValue < target) {// 目标值可能在右下、右上、左下子矩阵中return search(matrix, target, row1, midCol + 1, midRow, col2) || // 右下子矩阵search(matrix, target, midRow + 1, col1, row2, midCol); // 左下子矩阵}else {// 目标值可能在左上子矩阵中return search(matrix, target, row1, col1, midRow, midCol - 1); // 左上子矩阵}
}bool Solution::findNumberIn2DArray(std::vector<std::vector<int>>& matrix, int target)
{if (matrix.empty())return false;int rows = matrix.size();int cols = matrix[0].size();return search(matrix, target, 0, 0, rows - 1, cols - 1);
}

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

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

相关文章

c++中的list容器讲解

文章目录 1. list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.6 list的迭代器失效 2. list的模拟实现2.1 模拟实现list 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 …

医疗知识图谱 neo4j

开源项目&#xff1a; https://github.com/liuhuanyong/QASystemOnMedicalKG 一.效果 二.需要安装&#xff1a; pip install pyahocorasick pip install py2neo 三.需要修改&#xff1a; 需要改的点&#xff1a; 1.改连接的方式 2.改读文件的方式 MedicalGraph 运行&am…

docker-compose安装Nacos2

文章目录 一. Mac1.1 数据库nacos_dev1.2 docker-compose.yaml1.3 部署1.4 卸载1.5 查看 二. Win102.1 docker-compose.yaml2.2 部署2.3 卸载 一. Mac 1.1 数据库nacos_dev sql文件地址 /** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache Li…

C语言_指针(1)

文章目录 前言一、指针数组1.1利用指针数组模拟出二维数组 二、数组指针2.1数组名是数组首元素的地址2.2 二维数组传参2.3 一级指针传参2.4 二级指针传参 三. 函数指针四 . typedef 重命名 前言 指针数组是由指针组成的数组。它的每个元素都是一个指针&#xff0c;可以指向任何…

工商银行潍坊分行党建RPA机器人项目解析

01 案例背景&#xff1a;银行业掀起引入RPA加速实现数字化转型的浪潮 近年来&#xff0c;金融科技的蓬勃发展极大促进了银行的业务创新&#xff0c;新技术、新业态层出不穷。随着银行业务和科技的融合逐步落实&#xff0c;银行业务正朝着线上化、智能化转变。科技赋能的转型范…

【管理运筹学】第 7 章 | 图与网络分析(4,最大流问题)

系列文章目录 【管理运筹学】第 7 章 | 图与网络分析&#xff08;1&#xff0c;图论背景以及基本概念、术语、矩阵表示&#xff09; 【管理运筹学】第 7 章 | 图与网络分析&#xff08;2&#xff0c;最小支撑树问题&#xff09; 【管理运筹学】第 7 章 | 图与网络分析&#xf…

学习笔记-配置备份静态路由及优先级

上一个笔记&#xff1a;学习笔记-静态路由配置有来无回导致无法访问目标IP 拓扑图&#xff1a; 书接上回。 模拟R2至R3之间的链路中断&#xff0c;配置备份路由通过R1访问R3。 shutdown掉R2的gi0/0/2端口&#xff0c;模拟链路中断。pingR3的gi0/0/0和R3的loopback0&#xff…

Java中如何获取一个字符串是什么类型

Java中如何获取一个字符串是什么类型&#xff1f; 在Java中&#xff0c;您可以使用一些方法来确定一个字符串的类型。下面是一些常用的方法&#xff1a; 使用正则表达式&#xff1a;您可以使用正则表达式来匹配字符串是否符合特定的模式或格式&#xff0c;以确定其类型。例如&…

Android——数据存储(二)(二十二)

1. SQLite数据库存储 1.1 知识点 &#xff08;1&#xff09;了解SQLite数据库的基本作用&#xff1b; &#xff08;2&#xff09;掌握数据库操作辅助类&#xff1a;SQLiteDatabase的使用&#xff1b; &#xff08;3&#xff09;可以使用命令操作SQLite数据库&#xff1b; …

Leangoo领歌 -敏捷任务管理软件,任务管理更轻松更透明

​任务管理&#xff0c;简单易懂&#xff0c;就是对任务进行管理。那怎么可以更好进行任务管理呢&#xff1f;怎么样样可以让任务进度可视化&#xff0c;一目了然呢&#xff1f;有效的管理可以让我们事半功倍。 接下来我们看一下如何借助任务管理软件高效的做任务管理。 首先…

Python Opencv实践 - Harris角点检测

参考资料&#xff1a;https://blog.csdn.net/wsp_1138886114/article/details/90415190 import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/chinease_tower.jpg", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#…

【Python】多线程

进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程&#xff1a;就是一个程序&#xff0c;运行在系统之上&#xff0c;那么便称之这个程序为一个运行进程&#xff0c;并分配进程ID…

【echarts】如何修改折线图X轴每个刻度的间隔宽度,让拥挤的空间变大,所有坐标点的文案可以显示得下,Echarts x轴文本内容太长的几种解决方案

Echarts 如何修改折线图X轴每个刻度的间隔宽度&#xff0c;让拥挤的空间变大&#xff0c;所有坐标点的文案可以显示得下&#xff0c;Echarts x轴文本内容太长的几种解决方案 有以下几种方案&#xff0c;堪称最全方案&#xff1a; 1、dataZoom进行坐标的比例缩放 通过调整dataZ…

设计模式篇(Java):装饰者模式

&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;设计模式篇-装饰者模式 &#x1f468;‍&#x1f4bb;本文简述&#xff1a;装饰者模式的详解以及jdk中的应用 &#x1f468;‍&#x1f4bb;上一篇文章&#xff1a; 设计模式篇(Java)&#xff1a;桥接模式 &#x1f468;‍&am…

vue+element使用阿里的图标库保存图标

阿里图标网站iconfont-阿里巴巴矢量图标库 我想使用保存图标&#xff0c;但是element的图标库没有找到可用的&#xff0c;首先在阿里的图标网站搜索保存 发现这个还不错 点击添加入库 点击购物车 点击添加至项目 点击下载到本地 把下载的压缩包里面的文件拖到自己项目里面 在m…

探索多态的本质【C++】

文章目录 多态的构成条件虚函数虚函数的重写&#xff08;覆盖&#xff09; 虚函数重写的两个例外C11 override和final区分重载、覆盖(重写)、隐藏(重定义)抽象类接口继承和实现继承多态的原理虚函数表 动态绑定和静态绑定动态绑定静态绑定 单继承中的虚函数表多继承中的虚函数表…

Java——》synchronized锁升级

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

mysql中GROUP_CONCAT函数详解

GROUP_CONCAT是MySQL中的一个聚合函数&#xff0c;它用于将多行数据按照指定的顺序连接成一个字符串&#xff0c;并返回结果。下面是对GROUP_CONCAT函数的详解&#xff1a; 语法&#xff1a; GROUP_CONCAT([DISTINCT] expr [,expr …] [ORDER BY {unsigned_integer | col_name…

Vue错误记录

文章目录 1. 项目build的时候报错Warning: Accessing non-existent property cat of module exports inside circular dependency2. WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not …

数据结构与算法之(赫夫曼树,哈夫曼树,压缩软件)

一&#xff1a;思考 1.电报发送&#xff1a;二战的时候大家都知道那时候普遍会应用电报&#xff0c;如果让你来设计一个电报的发送编码你该如何设计呢&#xff1f; 2.压缩算法&#xff1a;给你10000个字符&#xff08;每个字符1btye&#xff0c;也就是8bit&#xff09;的文件&a…