AcWing之二维数组的查找
题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
样例
输入数组:
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]如果输入查找数值为7,则返回true,
如果输入查找数值为5,则返回false。
方法一:
(单调性扫描) O(n+m)O(n+m)
核心在于发现每个子矩阵右上角的数的性质:
如下图所示,x左边的数都小于等于x,x下边的数都大于等于x
因此我们可以从整个矩阵的右上角开始枚举,假设当前枚举的数是 xx:
如果 xx 等于target,则说明我们找到了目标值,返回true;
如果 xx 小于target,则 xx 左边的数一定都小于target,我们可以直接排除当前一整行的数;
如果 xx 大于target,则 xx 下边的数一定都大于target,我们可以直接排序当前一整列的数;
排除一整行就是让枚举的点的横坐标加一,排除一整列就是让纵坐标减一。
当我们排除完整个矩阵后仍没有找到目标值时,就说明目标值不存在,返回false。
时间复杂度分析
每一步会排除一行或者一列,矩阵一共有 nn 行,mm 列,所以最多会进行 n+mn+m 步。所以时间复杂度是 O(n+m)O(n+m)。
作者:yxc
链接:https://www.acwing.com/solution/AcWing/content/702/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:bool searchArray(vector<vector<int>> array, int target) {if (array.empty() || array[0].empty()) return false;int n=array[0].size(),m=array.size();int i=0, j=n;while(j>=0 || i<m) {if(array[i][j] > target) j--; //在左边,则列--if(array[i][j] < target) i++; //在右边,则行++return true;}return false;}
};
心得
记住这个矩阵的形状即可
AcWing之二维数组的查找相关推荐
- 剑指offer之二维数组中查找
1 问题 二维数组中查找: 在一个二维数组钟,每一行都按照从左到右递增得顺序排列,每一列 都按照从上往下得递增排列,请完成一个函数,输入这样得一个二维数组和一个 整数,判断数组是否含有该整数 列如: ...
- 数据结构与算法--数组:二维数组中查找
数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存.即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存, ...
- 二维数组中查找指定数据
二维数组中查找指定数据 数组中元素每行按照从左到右递增,每列从上到下递增 bool Find(int* arr, int rows, int columns, int data) {bool foun ...
- 二维数组的查找 java_二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. array: 待查找的二 ...
- 每天一道LeetCode-----在有序的二维数组中查找某个元素
原题链接Search a 2D Matrix 判断一个二维数组中是否存在某个值 该数组满足 每一行元素按从左到右递增顺序排列 当前行的第一个元素大于上一行的最后一个元素 假设二维数组的维度是m × n ...
- 在二维数组中查找一个数
在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列也按照从上到下递增的顺序排列.在这样一个序列中查找一个数 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 例如查找 ...
- 剑指offer面试题[3]-二维数组的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 注:对于一个容器存储的 ...
- [面试] 算法 —— 数组(有序二维数组的查找)
这里的有序二维数组指的是:每一行都是按照从左到右递增,从每一列都是按照从上到下递增的顺序排序. 我们定义如下的查找规律: 首先选取数组中右上角(也可选择数组左下角)的数字. (1)如果该数字等于要查找 ...
- 剑指offer:2.二维数组的查找(Java版)
备注:本文参照<剑指offer第二版> 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数, 输入这样的一个二维数组和一个整数 ...
最新文章
- 500万相机芯片尺寸_华硕ZenFone Live L2推出500万像素自拍照相机,电池容量3000毫安...
- pair的常见用法详解
- 小米知识图谱团队斩获CCKS 2020实体链指比赛冠军
- Kubernetes 入门进阶实战
- 使用代码创建ABAP transparent table
- .net打包自动安装数据库
- 江苏单招试题计算机原理及答案,江苏省对口单招计算机组装与维修计算机原理考题分类汇总.docx...
- Cortex-M/R/A 芯片选型及简介
- Python中的logging模块
- 14.Linux 高性能服务器编程 --- 多线程编程
- 56. 基于 HTTP 追加协议
- 快速启动器工具 Maye(转载)
- qTip2 精致的jQuery提示信息插件
- 上计算机课应该有的表现,计算机应用基础学习过程表现
- 嵌入式系统三级考试终结版2019.3
- CentOS7 U盘安装操作系统卡在Reached target Basic System.
- 如何避免扫码枪重复扫码
- 实验8 脉冲宽度调制(PWM)模块 北京化工大学 2019090034
- vue项目打包部署注意点 + 宝塔面板几步部署项目
- Qt技巧:获取QTextEdit文本内容
热门文章
- linux 统计命令执行后的行数或者统计目录下文件数目
- 蓝桥杯 之 基础练习10:十进制转十六进制
- 利用C语言中的setjmp和longjmp,来实现异常捕获和协程
- 少写点if-else吧,它的效率有多低你知道吗?
- android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
- php 公众号验证回调方法_微信公众号关键词自动回复设置方法!
- 数据结构之堆:堆的介绍与python实现——12
- .net get set 初始化_.NET项目升级:可为空引用
- 笔记本电脑关机快捷键_2020年双十一值得入手的高性价比笔记本电脑外设推荐...
- python 接口 、继承、重载运算符