二维数组中的查找

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

解题思路:我们以下面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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值