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

二维数组中的查找

程序员文章站 2022-06-17 19:48:10
...

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

解题思路:我们以下面3*3的矩阵(该矩阵符合题目的要求)为例,对该题进行分析。当我们要查找的元素为“10”时,由于该矩阵中不存在,因此返回false,当我们要查找的元素为“5”时,由于该矩阵你 中存在,因此返回true。

二维数组中的查找

通过观察矩阵,不难发现该矩阵的规律还是很明显的。矩阵的左上角的元素是该矩阵中最小的元素,左下角的元素是该行元素中最小的,但却是该列元素中最大的,相反,矩阵上角的元素是该行元素最大的,但却是该列元素最小的,矩阵右下角的元素是该矩阵中元素最大的。

看到这里,我么不难想到,定一个“标志数”将它和我们要查找的数不断地进行比较,从而可以确定我们要查找的数是否存在于该数组,但是我们该怎么定这个“标志数”呢?(上面说的四个角,一一进行分析)

二维数组中的查找

由于左下角和右上角都可以作为“标志数”,很多博客中也有右上角的做法图,在这里,我以左下角为例,通过下图的几个过程来对查找元素“5”进行分析(右上角同理),但是代码实现的时候两者都实现!

二维数组中的查找

代码实现如下:

1.vector版本的右上角

bool Find(int target, vector<vector<int>> array)
{
	//判空
	if (array.empty())
		return false;

	int rows = array.size();
	int cols = array[0].size;
	int x = 0;
	int y = cols - 1;
	bool found = false;

	while (x >= 0 && y >= 0 && x < rows &&y < cols)
	{
		if (array[x][y] == target)
		{
			return true;
		}
		else if (array[x][y]>target)
		{
			x++;
		}
		else
		{
			y--;
		}
	}

	return found;
}

1.vector版本的左下角

//vector左下角
bool Find(int target, vector<vector<int>> array)
{
	if (array.size == 0)
		return false;


	int rows = array.size();
	int cols = array.size();
	int x = rows - 1;
	int y = 0;
	int found = false;

	while (x >= 0 && y >= 0 && x < rows&&y < cols)
	{
		if (array[x][y] == target)
		{
			return true;
		}
		else if (array[x][y]>target)
		{
			y++;
		}
		else
		{
			x--;
		}
	}

	return found;
}

注意:在本题中,使用vector时,左下角和右上角的区别在于对于坐标x和y的位置控制上,以及对应的行和列的加减操作。

3.矩阵版本的右上角

//矩阵右上角
bool Find(int* matrix, int rows, int cols, int number)
{
	bool found = false;

	if (matrix == NULL || rows <= 0 || cols <= 0)
		return found;

	
	while (matrix != NULL&&rows > 0 && cols > 0)
	{
		//定义右上角
		int x = 0;
		int y = cols - 1;

		if (matrix[x*cols + y] == number)
		{
			return true;
		}
		else if (matrix[x*cols + y] > number)
		{
			x--;
		}
		else
		{
			y++;
		}
	}
}

4.矩阵版本的左下角

bool Find(int* matrix, int rows, int cols, int number)
{
	bool found = false;

	if (matrix == NULL || rows <= 0 || cols <= 0)
		return found;

	
	while (matrix != NULL&&rows > 0 && cols > 0)
	{
		//定义左下角
		int x = rows - 1;
		int y = 0;

		if (matrix[x*cols + y] == number)
		{
			return true;
		}
		else if (matrix[x*cols + y] > number)
		{
			x--;
		}
		else
		{
			y++;
		}
	}
}

注意:本题使用矩阵实现本题时,同样,和使用vector一样都需要注意矩阵位置的控制,还有就是,可能很多人对于“marix[x*cols+y]”有一些疑惑,举个例子,大家就不难理解了(例如右上角,它的位置相当于[0,2],用0*cols+2得到的数字就是我们要寻找的右上角的元素“3”)!

int main()
{
	int sz[] = { 1, 2, 3,
				 4, 5, 6,
				 7, 8, 9 };

	bool b = Find(sz, 3, 3, 5);
	cout << b << endl;
	getchar();

	return 0;
}