欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-17 17:06:15
...

题目总结与代码归档:
【剑指offer-2】题目目录【C++版本】

GitHub代码路径: GitHub

面试题4

二维数组中的查找

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

解题思路

由于每一行都按照从左到右递增,每一列都按照从上到下的递增,右上角的数A必然大于所在行小于所在列,我们可以将需要判断的数X与右上角的数A比较。X > A剔除A所在行;X < A 剔除A所在列,再在剔除后的数组中找右上角数A与X比较
如下图 a b c d,二维数组中查找数字7
剑指offer 面试题4:二维数组中的查找【C++版本】

代码实现

# include<iostream>

using namespace std;

bool Find(int* matrix, int rows, int columns, int number);

int main()
{
	int matrix[4][4] = { { 1, 2, 8, 9 },{ 2, 4, 9, 12 },{ 4, 7, 10, 13 },{ 6, 8, 11, 15 } };
	// 将二维数组当一维数组操作
	bool ret = Find(*matrix, 4, 4, 7);
	if (ret)
		cout << "found" << endl;
	else
		cout << "not found" << endl;
	system("pause");
	return 0;
}

bool Find(int* matrix, int rows, int columns, int number)
{
	bool found = false;
		
	if (matrix != nullptr&&rows>0&&columns>0)
	{
		// 从右上角开始 也就是 0行 columns - 1 列
		int row = 0;
		int column = columns - 1;
		// 迭代处理 数据范围 逐步向左下角
		while (row < rows && column > 0)
		{
			// 右上角的数
			int test_num = matrix[row * columns + column]; // 当一维数组操作
			// 找到
			if (test_num == number) {
				found = true;
				break;
			}
			// 根据 test_num 与 number 大小关系 ,移动 row column(剔除行或者列)
			else if (test_num < number)	//剔除行
				row++;
			else   //剔除列
				column--;
		}

	}
	return found;
}

参考资料:


GitHub链接:
https://github.com/lichangke
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习