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



 

查找思路

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

(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>  
<span style="font-size: 18px;">#include "stdafx.h"
#include <assert.h>
#include <iostream>
using namespace std;

//在rows行*columns列的二维数组p_nArray中查找nFindNum,找到返回ture, 否则返回false
bool IsFind(int *p_nArray, int rows, int columns, int nFindNum)
{
	assert(p_nArray!=NULL && rows>0 && columns>0);

	if (p_nArray!=NULL && rows>0 && columns>0)
	{
		int row = 0;
		int column = columns - 1;

		while (row<rows && column>=0)
		{			
			if (*(p_nArray + row*columns + column) == nFindNum)
			{
				return true;
			}
			else if (*(p_nArray + row*columns + column) > nFindNum)
			{
				--column;
			}
			else
			{
				++row;
			}
		}

		return false;
	}
	else
	{
	   return false;
	}	
}

int _tmain(int argc, _TCHAR* argv[])
{
	int nArr[4][4] = {
		{1, 2, 8, 9},
		{2, 4, 9, 12},
		{4, 7, 10, 13},
		{6, 8, 11, 15}
	};	
	cout << IsFind(*nArr, 4, 4, 7) << endl;
	cout << IsFind(*nArr, 4, 4, 0) << endl;
	//对于二维数组,行指针加1跳过一行,列指针加1跳过一个元素
	system("pause");
	return 0;
}
</span>


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



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

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值