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

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

例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。

1      2      8        9

2      4      9       12

4      7      10     13

6      8      11     15


解决思路(一):从右上角开始查

               (1)首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;

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

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

               (4)重复(1)-(3)。

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

代码实现:

#include <iostream>
using namespace std;

//面试题3:二维数组中的查找
bool FindNumFromMatrix(int *matrix, int rows, int cols, int num)
{
	bool isFound = false;
	if(matrix == NULL || rows <= 0 || cols <= 0){  //一定要对特殊输入进行检查
		return isFound;
	}

	int row = 0;
	int col = cols - 1;
	while(row < rows && col >= 0){
		if(matrix[row * cols + col] == num){
			isFound = true;
			break;
		}
		else if(matrix[row * cols + col] > num){
			col--;
		}
		else if(matrix[row * cols + col] < num){
			row++;
		}
	}
	return isFound;
}

int main()
{
	int a[][4] = {1,2,8,9,2,4,9,12,6,7,10,13,6,8,11,15};
	int *p = a[0];
	int num = 7;
	bool res = FindNumFromMatrix(p, 4, 4, num);
	if(res){
		cout<<num<<" is in matrix!"<<endl;
	}	
	else{
		cout<<num<<" isnot in matrix!"<<endl;
	}
		
	system("pause");
	return 0;
}

解决思路(二):从左下角开始查

               (1)首先选取数组中左下角的数字。如果该数字等于要查找的数字,查找过程结束;

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

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

               (4)重复(1)-(3)。

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

代码实现:

#include <iostream>
using namespace std;

//面试题3:二维数组中的查找
bool FindNumFromMatrix(int *matrix, int rows, int cols, int num)
{
	bool isFound = false;
	if(matrix == NULL || rows <= 0 || cols <= 0){  //一定要对特殊输入进行检查
		return isFound;
	}

	int row = rows - 1;
	int col = 0;
	while(row >= 0 && col < cols){
		if(matrix[row * cols + col] == num){
			isFound = true;
			break;
		}
		else if(matrix[row * cols + col] < num){
			row--;
		}
		else if(matrix[row * cols + col] > num){
			col++;
		}
	}
	return isFound;
}

int main()
{
	int a[][4] = {1,2,8,9,2,4,9,12,6,7,10,13,6,8,11,15};
	int *p = a[0];
	int num = 7;
	bool res = FindNumFromMatrix(p, 4, 4, num);
	if(res){
		cout<<num<<" is in matrix!"<<endl;
	}	
	else{
		cout<<num<<" isnot in matrix!"<<endl;
	}
		
	system("pause");
	return 0;
}

以上的两种方法分别是从数组查找范围的右上角和左下角开始查找,但是不能从左上角和右下角开始查找。以左上角为例,最初数字1位于初始数组的左上角,由于1小于7,那么7应该位于1的右边或者下边。此时我们既不能从查找范围内剔除1所在的行,也不能剔除1所在的列,这样我们就无法缩小查找的范围了。

其实究竟从哪个角开始查还是是具体问题而定,例如我们把题目改为原始矩阵是从左到右递减,从上到下递增,这种情况下就只能从左上角或右下角开始搜索了^_^,所以学习算法,重要的是掌握算法设计的思路,这很重要。



Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计,皆可应用在项目、毕业设计、课程设计、期末/期/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值