题目

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

样例

输入数组:
[
[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之二维数组的查找相关推荐

  1. 剑指offer之二维数组中查找

    1 问题 二维数组中查找: 在一个二维数组钟,每一行都按照从左到右递增得顺序排列,每一列 都按照从上往下得递增排列,请完成一个函数,输入这样得一个二维数组和一个 整数,判断数组是否含有该整数 列如: ...

  2. 数据结构与算法--数组:二维数组中查找

    数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存.即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存, ...

  3. 二维数组中查找指定数据

    二维数组中查找指定数据 数组中元素每行按照从左到右递增,每列从上到下递增 bool Find(int* arr, int rows, int columns, int data) {bool foun ...

  4. 二维数组的查找 java_二维数组中的查找

    题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. array: 待查找的二 ...

  5. 每天一道LeetCode-----在有序的二维数组中查找某个元素

    原题链接Search a 2D Matrix 判断一个二维数组中是否存在某个值 该数组满足 每一行元素按从左到右递增顺序排列 当前行的第一个元素大于上一行的最后一个元素 假设二维数组的维度是m × n ...

  6. 在二维数组中查找一个数

    在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列也按照从上到下递增的顺序排列.在这样一个序列中查找一个数 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 例如查找 ...

  7. 剑指offer面试题[3]-二维数组的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 注:对于一个容器存储的 ...

  8. [面试] 算法 —— 数组(有序二维数组的查找)

    这里的有序二维数组指的是:每一行都是按照从左到右递增,从每一列都是按照从上到下递增的顺序排序. 我们定义如下的查找规律: 首先选取数组中右上角(也可选择数组左下角)的数字. (1)如果该数字等于要查找 ...

  9. 剑指offer:2.二维数组的查找(Java版)

    备注:本文参照<剑指offer第二版> 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数, 输入这样的一个二维数组和一个整数 ...

最新文章

  1. 500万相机芯片尺寸_华硕ZenFone Live L2推出500万像素自拍照相机,电池容量3000毫安...
  2. pair的常见用法详解
  3. 小米知识图谱团队斩获CCKS 2020实体链指比赛冠军
  4. Kubernetes 入门进阶实战
  5. 使用代码创建ABAP transparent table
  6. .net打包自动安装数据库
  7. 江苏单招试题计算机原理及答案,江苏省对口单招计算机组装与维修计算机原理考题分类汇总.docx...
  8. Cortex-M/R/A 芯片选型及简介
  9. Python中的logging模块
  10. 14.Linux 高性能服务器编程 --- 多线程编程
  11. 56. 基于 HTTP 追加协议
  12. 快速启动器工具 Maye(转载)
  13. qTip2 精致的jQuery提示信息插件
  14. 上计算机课应该有的表现,计算机应用基础学习过程表现
  15. 嵌入式系统三级考试终结版2019.3
  16. CentOS7 U盘安装操作系统卡在Reached target Basic System.
  17. 如何避免扫码枪重复扫码
  18. 实验8 脉冲宽度调制(PWM)模块 北京化工大学 2019090034
  19. vue项目打包部署注意点 + 宝塔面板几步部署项目
  20. Qt技巧:获取QTextEdit文本内容

热门文章

  1. linux 统计命令执行后的行数或者统计目录下文件数目
  2. 蓝桥杯 之 基础练习10:十进制转十六进制
  3. 利用C语言中的setjmp和longjmp,来实现异常捕获和协程
  4. 少写点if-else吧,它的效率有多低你知道吗?
  5. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
  6. php 公众号验证回调方法_微信公众号关键词自动回复设置方法!
  7. 数据结构之堆:堆的介绍与python实现——12
  8. .net get set 初始化_.NET项目升级:可为空引用
  9. 笔记本电脑关机快捷键_2020年双十一值得入手的高性价比笔记本电脑外设推荐...
  10. python 接口 、继承、重载运算符