当前位置: 首页 > news >正文

特殊二维数组的查找

题目:在一个二维数组的中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下的递增序列排序,请设计一个函数,输入这样的一个二维数组和一个整数,查询在此二维数组中是否存在此整数。

example:在下列数组中

1   2   8   9

2   4   9   12

4   7   10   13

6   8   11   15

查询是否有7存在,存在返回true,否则返回false(显然应该返回true)

查询是否有5存在,存在返回true,否则返回false(显然应该返回false)

这么简单?耿直的我立马就想到了暴力算法,一个一个比不就对了?

然而,然而要的是效率,如果这样解随便一个二维数组都可以这么做,显然忽略了已经给出来的条件:行递增,列也递增。

所以可以通过利用这个特征,在查找的过程中不停的排除一些数,不停的缩小查找规模从而找到比较好的解法。

故以查找7为例:

每次都把7和数组中右上角的数字比:

    如果相等,那么即找到了此数字,直接返回true;

    如果7小于此数字,而此数字又是本列中最小的数字,故去除此列,不再查找此列。

    如果7大于此数字,而此数字又是本行中最大的数字,故去除此行,不再查找此行。

然后再把7和删除了行(或者列)的数组的右上角元素相比较;

    如果删除了整个数组都没有找到,那么就返回false;未找到

7的整个具体查找过程如下图所示:(* 图片来自于《《剑指offer名气面试官精讲典型编程题》》作者:何海涛)

 

图中阴影部分为删除了行(或者列)之后剩下的查找范围,阴影部分变为空时还未找到那么就返回false。

故可以简单的写出如下代码:

 1 #include<iostream>
 2 using namespace std;
 3 const int MaxSize = 4;
 4 const int row = MaxSize;//行数
 5 const int cols = MaxSize;//列数
 6 /*
 7     A:所要查找的数字
 8     r:数组右上角数字的行号(初始为0)
 9     c:数组右上角数字的列号(本例中初始为3)
10 */
11 bool FindHaveA(int B[][MaxSize], int A, int r, int c)
12 {
13     if (r <= row-1&&c >= 0)                    //判断待查阴影区域是否为空
14     {
15         int mr = r, mc = c;
16         if (B[mr][mc] == A){                    //相等返回true
17             //cout << "行号为:" << mr + 1 << "列号为:" << mc + 1 << endl;
18             return true;
19         }
20         else if (B[mr][mc] > A){                //>A 则去除此列
21             --mc;
22         }
23         else{                                   //<A 则去除此行
24             ++mr;
25         }
26         FindHaveA(B, A, mr, mc);                //递归查找新的右上角元素
27     }
28     else
29         return false;                           //未找到
30 }
31 int main()
32 {
33     int B[][MaxSize] = { 1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15 };
34     bool R = FindHaveA(B, 7, 0, 3);                //查7
35     //bool R = FindHaveA(B, 5, 0, 3);              //查5
36     if (R)
37         cout << "true" << endl;
38     else
39         cout << "false" << endl;
40     system("pause");
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/General-up/p/5392843.html

相关文章:

  • win8 开发之旅(19) --足球游戏揭秘6
  • linux下sed基本用法详解
  • [翻译] UPCardsCarousel
  • Java编程的逻辑 (1) - 数据和变量
  • ABP源码分析三十二:ABP.SignalR
  • office2003 安装步骤及注意事项
  • 我的屌丝giser成长记-研一篇(下)
  • 本周活动
  • MapReduce的过程(2)
  • Android 双卡双待识别
  • 房坑
  • 该不该用inline-block取代float? inline和float的区别?
  • hibernate--联合主键--XML
  • 动态素组(ArrayList)
  • cssReset - css初始化
  • bearychat的java client
  • gf框架之分页模块(五) - 自定义分页
  • js如何打印object对象
  • Just for fun——迅速写完快速排序
  • Linux各目录及每个目录的详细介绍
  • PHP 7 修改了什么呢 -- 2
  • Python语法速览与机器学习开发环境搭建
  • SQL 难点解决:记录的引用
  • VuePress 静态网站生成
  • 闭包--闭包之tab栏切换(四)
  • 电商搜索引擎的架构设计和性能优化
  • 翻译--Thinking in React
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 区块链共识机制优缺点对比都是什么
  • 在Unity中实现一个简单的消息管理器
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #WEB前端(HTML属性)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (SpringBoot)第二章:Spring创建和使用
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计高校学生选课系统
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十一)图像的罗伯特梯度锐化
  • (万字长文)Spring的核心知识尽揽其中
  • (转)Linq学习笔记
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET使用存储过程实现对数据库的增删改查
  • .NET文档生成工具ADB使用图文教程
  • :中兴通讯为何成功
  • @WebService和@WebMethod注解的用法
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例