剑指 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.rhkb.cn/news/123439.html

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

相关文章

Android 状态栏显示运营商名称

Android 原生设计中在锁屏界面会显示运营商名称&#xff0c;用户界面中&#xff0c;大概是基于 icon 数量长度显示考虑&#xff0c;对运营商名称不作显示。但是国内基本都加上运营商名称。对图标显示长度优化基本都是&#xff1a;缩小运营商字体、限制字数长度、信号图标压缩上…

案例聚焦:F5怎么样提升游戏玩家体验?

对手机游戏市场有过了解的小伙伴&#xff0c;定然对Deltatech Gaming Limited这个公司不会陌生。作为印度在线游戏和娱乐行业的领跑者&#xff0c;两个最受欢迎的多人游戏应用分别为多人游戏的 “Addagames” 和扑克类游戏 “Adda52” &#xff0c;它们会定期举办在线联赛。而这…

php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法非常简单

php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法&#xff0c;主要使用到了 php 的时间函数 mktime。下面首先还是以示例说明如何使用 mktime 获取今日、昨日、上周、本月的起始时间戳和结束时间戳&#xff0c;然后在介绍一下 mktime 函数作用和用法。非常简单哦…

Windows云服务器 PHP搭建网站外网无法访问的问题

前言&#xff1a;本人在华为云上租了一台windows的云主机&#xff0c;可以远程访问桌面的那种&#xff0c;然后想搭个网站&#xff0c;最开始想到的是IIS&#xff0c;测试了下用html的文件&#xff0c;没有问题。但是&#xff0c;php文件却不能用&#xff0c;因为少了PHP环境。…

Layer 2盛夏已至,StarkNet如何实现价值跃迁?

作者&#xff5c;Jason Jiang Layer 2概念在2023年夏天迎来爆发。Coinbase、ConsenSys等加密巨头纷纷下场&#xff0c;其部署的原生L2解决方案Base、Linea在过去两个月内相继完成主网上线&#xff1b;被誉为L2 四大天王之一的StarkNet也在夏天顺利完成“量子跃迁”升级&#x…

JavaSE,无框架实现贪吃蛇

JavaSE&#xff0c;无框架实现贪吃蛇 文章目录 JavaSE&#xff0c;无框架实现贪吃蛇1.整体思考2.可能的难点思考2.1 如何表示游戏界面2.2 如何渲染游戏界面2.3 如何让游戏动起来2.4 蛇如何移动 3.流程图制作4.模块划分5.模块完善5.0常量优化5.1监听键盘服务i.输入存储ii.键盘监…

Direct3D颜色

在Direct3D中颜色用RGB三元组来表示&#xff0c;RGB数据可用俩种不同的结构来保存&#xff0c;第一种是D3DCOLOR&#xff0c;它实际上与DWORD类型完全相同&#xff0c;共有32位&#xff0c;D3DCOLOR类型种的各位被分成四个8位项&#xff0c;每项存储了一种颜色分量的亮度值。 由…

JDK7多线程并发环境HashMap死循环infinite loop,CPU拉满100%,Java

JDK7多线程并发环境HashMap死循环infinite loop&#xff0c;CPU拉满100%&#xff0c;Java HashMap底层数据实现是数组链表&#xff0c;链表在哈希碰撞后装入新数据&#xff0c;像是一个桶。 HashMap在JDK7的实现中&#xff0c;并发环境存在死循环infinite loop问题。导致的结果…

DAY-01--分布式微服务基础概念

一、项目简介 了解整体项目包含后端、前端、周边维护。整个项目的框架知识。 二、分布式基础概念 1、微服务 将应用程序 基于业务 拆分为 多个小服务&#xff0c;各小服务单独部署运行&#xff0c;采用http通信。 2、集群&分布式&节点 集群是个物理形态&#xff0c;…

Redis:StringRedisTemplate简介

&#xff08;笔记总结自b站黑马程序员课程&#xff09; 为了在反序列化时知道对象的类型&#xff0c;JSON序列化器会将类的class类型写入json结果中&#xff0c;存入Redis&#xff0c;会带来额外的内存开销。 为了减少内存的消耗&#xff0c;我们可以采用手动序列化的方式&am…

【Python】【Fintech】用Python和蒙特卡洛法预测投资组合未来收益

【背景】 想利用蒙特卡洛方法和yahoo,stooq等财经网站上的数据快速预测特定portfolio的收益。 【分析】 整个程序的功能包括 读取json中的portfolio组合创建蒙特卡洛模拟预测收益的算法创建从财经网站获得特定投资组合数据,并根据2的算法获得该Index或Portfolio收益预测结…

机器学习的第一节基本概念的相关学习

目录 1.1 决策树的概念 1.2 KNN的概念 1.2.1KNN的基本原理 1.2.2 流程&#xff1a; 1.2.3 优缺点 1.3 深度学习 1.4 梯度下降 损失函数 1.5 特征与特征选择 特征选择的目的 1.6 python中dot函数总结 一维数组的点积&#xff1a; 二维数组&#xff08;矩阵&#xff09;的乘法&am…

Python代码雨

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

python通过docker打包执行

背景 正常情况下,python脚本执行需要安装有python环境,那python环境虽然也可以通过移植的方法来安装,那总归是比较麻烦的,下面通过docker打包的方式来执行python脚本 1、安装python镜像 准备两个文件即可,dockerfile、requirements.txt两个文件的内容分别如下 同目录下…

肖sir__设计测试用例方法之梳理测试点11(微信发红包)

梳理测试点 讲解测试点&#xff1a; 1、定义&#xff1a;测试点就是测试的功能点&#xff0c;是指在软件测试过程中需要覆盖或关注的特定功能&#xff0c;特性或场景。 2、流程&#xff1a;拿到需求&#xff0c;梳理测试点(一般使用xmind图梳理)&#xff0c;在根据测试点使用测…

Python爬虫-爬取文档内容,如何去掉文档中的表格,并保存正文内容

前言 本文是该专栏的第58篇,后面会持续分享python爬虫干货知识,记得关注。 做过爬虫项目的同学,可能或多或少爬取过文档数据,比如说“政务网站,新闻网站,小说网站”等平台的文档数据。爬取文档数据,笔者这里就不过多详述,而本文,笔者将主要介绍在爬取文档数据的过程中…

API接口已经成为企业应用程序开发和管理的重要组成部分

API接口的价值 随着数字化时代的到来&#xff0c;API接口已经成为企业应用程序开发和管理的重要组成部分。API不仅是一种连接不同系统、提高数据流动性和促进协作的工具&#xff0c;而且还是一种重要的商业战略&#xff0c;可以为组织带来许多实际的价值。本文将探讨API接口的…

端口扫描-安全体系-网络安全技术和协议

端口扫描-安全体系-网络安全技术和协议 端口扫描信息安全的保证体系和评估方法网络安全技术网络攻击和威胁(重要)网络安全协议 端口扫描 全TCP连接:三次握手 半打开式扫描:前两次握手 FIN扫描:不用建立TCP连接 第三方扫描: 拒绝服务攻击有: 同步包风暴ICMP攻击SNMP攻击 都是修改…

LeetCode 15 三数之和

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 // 1. 排序双指针 // 2. 固定一个值nums[i] 然后去剩下的位置去找 两数之和符合nums[j]nums[k]是否等于-nums[i] // 3. 细节问题&#xff1a;由于题目中是不可以包含重复的三元组的…

提升效率:PostgreSQL准确且快速的数据对比方法

作为一款强大而广受欢迎的开源关系型数据库管理系统&#xff0c;PostgreSQL 在数据库领域拥有显著的市场份额。其出色的可扩展性、稳定性使其成为众多企业和项目的首选数据库。而在很多场景下&#xff08;开发|生产环境同步、备份恢复验证、数据迁移、数据合并等&#xff09;&a…