剑指offer-面试题3.二维数组中的查找
2015-07-20 22:35
323 查看
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增
的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数。
算法流程如下:
比如一个二维数组array:
1.这个二维数组的左上角是最小的数据,右下角为最大的数,
首先判断查找的数是否number<array[0][0]或number>array[1][1]
2.当number的大小在数组范围内再开始查找,找数组的右上角或者左下角开始
作为比较的基准,当选择左上角的时候,假设我们查找的为number=7
3.如果numbe<9,说明number比最后一列都小,再比较无意义
这时候数组为:
4.我们再取右上角的8作为基准,8大于7,再去掉最后一列
5.我们再取右上角的2作为基准,2<7那么,说明第一行再比较无意义,去掉第一行
6.我们再把右上角的4作为基准,4<7那么,去掉第一行
7.现在我们再比较右上角元素,7==7 恩 找到了。
这道题的解法如下:
几点注意:
1.查找的时候有的同学可能会问能不能不从右上角开始作为基准。
答案是肯定的,但是只能从右上角和左下角作为基准,为什么?
因为我们选择的基准必须在某个维度上是最大的在某个维度上是
最小的,不然我们就不能根据比较的结果决定是否去掉一行或者去掉一列
2.查找的结束条件是,当我们的右上角元素索引值只要有一个维度的索引值
不在二维数组的正常索引范围内就说明需要查找的元素不在这个数组中。
尤其是第一点,希望读者好好理解。
的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数。
算法流程如下:
比如一个二维数组array:
1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15
1.这个二维数组的左上角是最小的数据,右下角为最大的数,
首先判断查找的数是否number<array[0][0]或number>array[1][1]
2.当number的大小在数组范围内再开始查找,找数组的右上角或者左下角开始
作为比较的基准,当选择左上角的时候,假设我们查找的为number=7
3.如果numbe<9,说明number比最后一列都小,再比较无意义
这时候数组为:
1 2 8 2 4 9 3 4 7 10 6 8 11
4.我们再取右上角的8作为基准,8大于7,再去掉最后一列
1 2 2 4 4 7 6 8
5.我们再取右上角的2作为基准,2<7那么,说明第一行再比较无意义,去掉第一行
2 4 4 7 6 8
6.我们再把右上角的4作为基准,4<7那么,去掉第一行
4 7 6 8
7.现在我们再比较右上角元素,7==7 恩 找到了。
这道题的解法如下:
bool Find(int* matrix,int rows,int columns,int number) { int i,j; if(number>matrix[rows*columns-1]||number<matrix[0]) return false; i=0; j=columns-1; if(number==matrix[i*columns+j]) return true; while(1) { if(number>matrix[i*4+j]) { i++; } if(number<matrix[i*4+j]) { j--; } if(number==matrix[i*columns+j]) return true; if(j<0||i<0||i>3||j>3) break; } return false; }
几点注意:
1.查找的时候有的同学可能会问能不能不从右上角开始作为基准。
答案是肯定的,但是只能从右上角和左下角作为基准,为什么?
因为我们选择的基准必须在某个维度上是最大的在某个维度上是
最小的,不然我们就不能根据比较的结果决定是否去掉一行或者去掉一列
2.查找的结束条件是,当我们的右上角元素索引值只要有一个维度的索引值
不在二维数组的正常索引范围内就说明需要查找的元素不在这个数组中。
尤其是第一点,希望读者好好理解。
相关文章推荐
- ios面试问题总结
- 面试问题总结
- 程序员福利
- 黑马程序员—IOS基础之OC—内存管理
- 剑指offer-面试题2.实例Singleton模式
- 中科创新面试题
- 黑马程序员——JAVA基础学习之其他对象
- Android\Java 面试题
- 剑指offer-面试题1:赋值运算符函数
- Android50道面试题
- 东华软件面试题
- 职业性格测验量表
- 黑马程序员-----自动装箱与拆箱
- 知识储备:软件开发校园招聘面试题
- 黑马程序员——Java学习总结:IO常用方法练习
- (剑指Offer)面试题29:数组中出现次数超过一半的数字
- 阿里面试题2015
- 黑马程序员----Java异常体系结构
- Java多线程面试常见核心问题总结
- 常见面试第三题之Activity的几种启动模式介绍