《剑指Offer》面试题4

 

1 问题描述

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

 

 

2 分析

按照二维数组元素之间的规律,选择从右上角(或者左下角)的元素开始查找。如果查找值相比元素值大,排除左边数据(一行)
如果查找值相比元素值小,排除下方数据(一列)。这样在每次比较后,都可以缩小查找范围,直到最终找到目标元素。

另外,二维数组在内存上是连续存储的,可以通过数组首地址+偏移量的方式定位数组中的元素。

 

3 代码

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


#include "iostream"

using namespace std;
//函数:查找指定数组
//输入:matrix数组、rows行数、columns列数、number查找的数字
bool Find(int* matrix, int rows, int columns, int number)
{
	if ((matrix == nullptr) || (rows <= 0) || (columns <=0))
	{//判断无效参数
		return false;
	}

	int row = 0;
	int column = columns - 1;
	while (row < rows && column >= 0)
	{//在数组范围内查找
		if (matrix[row*columns + column] == number)
		{//查找到目标
			return true;
		}
		else if (matrix[row*columns + column] < number)
		{//向下继续查找
			row++;
		}
		else
		{//向左继续查找
			column--;
		}
	}
	return false;

}

void test01()
{
    int matrix[][4] = {
    	{1, 2, 8, 9}, 
    	{2, 4, 9, 12}, 
    	{4, 7, 10, 13}, 
    	{6, 8, 11, 15}
    };
    bool ret = Find(&matrix[0][0], 4, 4, 4);

    cout << "result:" << ret << endl;
}

int main(int argc, char const *argv[])
{
	test01();
	return 0;
}