博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer-面试题3.二维数组中的查找
阅读量:6675 次
发布时间:2019-06-25

本文共 1166 字,大约阅读时间需要 3 分钟。

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增

的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数。

 

算法流程如下:

比如一个二维数组array:

1 1 2 8 92 3 2 4 9 124 5 4 7 10 136 7 6 8 11 15

 

1.这个二维数组的左上角是最小的数据,右下角为最大的数,

首先判断查找的数是否number<array[0][0]或number>array[1][1]

2.当number的大小在数组范围内再开始查找,找数组的右上角或者左下角开始

作为比较的基准,当选择左上角的时候,假设我们查找的为number=7

3.如果numbe<9,说明number比最后一列都小,再比较无意义

这时候数组为:

1 1 2 8 2 2 4 9 3 4 7 10 4 6 8 11

4.我们再取右上角的8作为基准,8大于7,再去掉最后一列

1 1 22 3 2 4 4 5 4 76 7 6 8

5.我们再取右上角的2作为基准,2<7那么,说明第一行再比较无意义,去掉第一行

1 2 4 2 3 4 74 5 6 8

6.我们再把右上角的4作为基准,4<7那么,去掉第一行

1 4 72 3 6 8

7.现在我们再比较右上角元素,7==7 恩 找到了。

 

 

这道题的解法如下:

 

1 bool Find(int* matrix,int rows,int columns,int number) 2 { 3     int i,j; 4  5     if(number>matrix[rows*columns-1]||number
matrix[i*4+j])20 {21 i++;22 }23 if(number
3||j>3)33 break;34 35 36 }37 return false;38 }

 

 

几点注意:

1.查找的时候有的同学可能会问能不能不从右上角开始作为基准。

答案是肯定的,但是只能从右上角和左下角作为基准,为什么?

因为我们选择的基准必须在某个维度上是最大的在某个维度上是

最小的,不然我们就不能根据比较的结果决定是否去掉一行或者去掉一列

 

2.查找的结束条件是,当我们的右上角元素索引值只要有一个维度的索引值

不在二维数组的正常索引范围内就说明需要查找的元素不在这个数组中。

尤其是第一点,希望读者好好理解。

 

转载于:https://www.cnblogs.com/vpoet/p/4662942.html

你可能感兴趣的文章
[译]集群调度架构的变革 (三)
查看>>
JavaScript设计模式与开发实践 - 观察者模式
查看>>
node学习
查看>>
sublime当中创建自定义代码段
查看>>
【前端学习】-margin
查看>>
GitChat · 架构 | 从订单中心开始,聊“多KEY”类业务数据库水平切分架构实践...
查看>>
前端每周清单第 28 期:JS 运行原理与优化,高性能 CSS 引擎,Coursera GraphQL 实践...
查看>>
lombok的使用
查看>>
Ubuntu+phpstorm+firefox+xdebug的配置
查看>>
python小记
查看>>
带着问题学 Kubernetes 抽象对象 Service
查看>>
原理解释 - 收藏集 - 掘金
查看>>
剖析Laravel队列系统--准备队列作业
查看>>
用vue-cli创建vue项目的一个坑
查看>>
书单记录,方便后面自己买书
查看>>
用 husky 和 lint-staged 构建超溜的代码检查工作流
查看>>
移动APP中那些关乎用户体验的测试项
查看>>
MailBee.NET Objects发送电子邮件(SMTP)教程二:SMTP认证
查看>>
前端面试题:从url到页面展现,这之中发生了什么?
查看>>
sublime打开TXT文件乱码的问题
查看>>