面试题2:二维数组中的查找

转载 2015年07月10日 16:25:53


 

查找思路

首先选取数组中右上角的数字。

(1)如果该数字等于要查找的数字,查询过程结束;

(2)如果该数字大于要查找的数字,剔除这个数字所在的列

(3)如果该数字小于要查找的数字,剔除这个数字所在的行

也就是说,如果要查找的数字不在数组的右上角,则每次都在数组的查找范围中剔除一行或一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。

 说明:当然也可以从左下角开始查找,道理一样;但不能从左上角或右下角开始查找。

 

上述过程如下图所示: 

C++代码:

  1. <span style="font-size: 18px;">#include "stdafx.h"  
  2. #include <assert.h>  
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. //在rows行*columns列的二维数组p_nArray中查找nFindNum,找到返回ture, 否则返回false  
  7. bool IsFind(int *p_nArray, int rows, int columns, int nFindNum)  
  8. {  
  9.     assert(p_nArray!=NULL && rows>0 && columns>0);  
  10.   
  11.     if (p_nArray!=NULL && rows>0 && columns>0)  
  12.     {  
  13.         int row = 0;  
  14.         int column = columns - 1;  
  15.   
  16.         while (row<rows && column>=0)  
  17.         {             
  18.             if (*(p_nArray + row*columns + column) == nFindNum)  
  19.             {  
  20.                 return true;  
  21.             }  
  22.             else if (*(p_nArray + row*columns + column) > nFindNum)  
  23.             {  
  24.                 --column;  
  25.             }  
  26.             else  
  27.             {  
  28.                 ++row;  
  29.             }  
  30.         }  
  31.   
  32.         return false;  
  33.     }  
  34.     else  
  35.     {  
  36.        return false;  
  37.     }     
  38. }  
  39.   
  40. int _tmain(int argc, _TCHAR* argv[])  
  41. {  
  42.     int nArr[4][4] = {  
  43.         {1, 2, 8, 9},  
  44.         {2, 4, 9, 12},  
  45.         {4, 7, 10, 13},  
  46.         {6, 8, 11, 15}  
  47.     };    
  48.     cout << IsFind(*nArr, 4, 4, 7) << endl;  
  49.     cout << IsFind(*nArr, 4, 4, 0) << endl;  
  50.     //对于二维数组,行指针加1跳过一行,列指针加1跳过一个元素  
  51.     system("pause");  
  52.     return 0;  
  53. }  
  54. </span>  


摘自剑指Offer名企面试官精讲典型编程题。



转自:http://blog.csdn.net/htyurencaotang/article/details/9324297 感谢原博主有爱共享!

剑指offer 面试题(二维数组中的查找) (2)

面试题: 二维数组中的查找    /* 题目:   在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成 一个函数,输入这样的一个二维数组和一个整数...
  • bitboss
  • bitboss
  • 2016年05月08日 15:41
  • 569

剑指offer面试题:二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 分析:看到这个问题,我们...
  • L_XRUI
  • L_XRUI
  • 2016年06月18日 16:20
  • 448

剑指Offer_面试题03_二维数组中的查找

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

剑指Offer面试题3(Java版):二维数组中的查找

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

剑指Offer 面试题3 二维数组中查找

剑指Offer 面试题3 二维数组中查找      参加鹅厂实习生笔试,在算法上被虐惨,做项目花了大部分时间,算法能力没能提高,迫切需要提高算法能力。遂收集各种面试题,刷刷算法。       本文参考...

【剑指offer】面试题 4:二维数组中的查找

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

面试题3. 二维数组中的查找

题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路: 首先选取数组...

【面试题】剑指Offer-3-在二维数组中进行查找

题目概述 给一个二维数组(例如下图),在二维数组的每一列,每一行中,元素的大小是递增的;如何快速判断一个数存不存在 解题思路 这里呢,从右上角开始判断,6的下标(0,2) 有四种情况 ...

剑指offer 面试题3 二维数组中的查找

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

《剑指Offer》学习笔记--面试题3:二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面试题2:二维数组中的查找
举报原因:
原因补充:

(最多只允许输入30个字)