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

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指offer]面试题3:二维数组中的查找相关的知识,希望对你有一定的参考价值。

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

解题思路:
首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。

代码如下:
从矩阵的右上角开始找:

#include <iostream>
using namespace std;
const int N = 4;

int a[4][N] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };

bool Find(int(*p)[N], int rows, int cols, int num)
{
	bool flag = false;
	if (p != nullptr && rows > 0 && cols > 0)
	{
		int row = 0;
		int col = cols - 1;
		while (row < rows && col >= 0)
		{
			if ((*(*(p + row) + col))==num)
			{
				flag = true;
				break;
			}
			else if ((*(*(p + row) + col)) > num) --col;
			else ++row;
		}
	}
	return flag;
}

int main()
{
	if (Find(a, 4, 4, 13)) cout << "yes" << endl;
	else cout << "no" << endl;
	if (Find(a, 4, 4, 14))cout << "yes" << endl;
	else cout << "no" << endl;
	return 0;
}

代码如下:
从矩阵的左下角开始找:

#include <iostream>
using namespace std;
const int N = 4;

int a[4][N] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };

bool Find(int(*p)[N], int rows, int cols, int num)
{
	bool flag = false;
	if (p != nullptr && rows > 0 && cols > 0)
	{
		int col = 0;
		int row = rows - 1;
		while (row >= 0 && col < cols)
		{
			if ((*(*(p + row) + col)) == num)
			{
				flag = true;
				break;
			}
			else if ((*(*(p + row) + col)) < num) ++col;
			else --row;
		}
	}
	return flag;
}

int main()
{
	if (Find(a, 4, 4, 13)) cout << "yes" << endl;
	else cout << "no" << endl;
	if (Find(a, 4, 4, 14))cout << "yes" << endl;
	else cout << "no" << endl;
	return 0;
}

测试用例:
● 二维数组中包含查找的数字(查找的数字是数组中的最大值和最小值,查找的数字介于数组中的最大值和最小值之间)。
● 二维数组中没有查找的数字(查找的数字大于数组中的最大值,查找的数字小于数组中的最小值,查找的数字在数组的最大值和最小值之间但数组中没有这个数字)。
● 特殊输入测试(输入空指针)。
本题考点:
● 考查应聘者对二维数组的理解及编程能力。二维数组在内存中占据连续的空间。在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储。因此我们可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应的元素。
● 考查应聘者分析问题的能力。当应聘者发现问题比较复杂时,能不能通过具体的例子找出其中的规律,是能否解决这个问题的关键所在。这个题目只要从一个具体的二维数组的右上角开始分析,就能找到查找的规律,从而找到解决问题的突破口。

以上是关于[剑指offer]面试题3:二维数组中的查找的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer(纪念版) 面试题3:二维数组中的查找

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

剑指Offer学习面试题:二维数组中的查找PHP实现

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

剑指Offer面试题九度OJ1384:二维数组中的查找

剑指offer题解二维数组中的查找