杨氏矩阵查找

一、问题描述

给定一个二维数组,如果这个二维数组满足下面两个条件则称为杨氏矩阵。

1. 在这个二维数组的每一行都按照从左到右的顺序递增。

2. 在这个二维数组的每一列都按照从上到下的顺序递增。

现在需要完成以下的一个功能:输入这样的一个二维数组,并且给定一个要查找的数,判断该数是否存在在这个二维数组中。

二、问题分析

这里不讲述遍历这个二维数组来查找该数(时间复杂程度为O(row * column))。既然是在杨氏矩阵中查找一个数find_number,那么就一定要用上杨氏矩阵的性质。假设查找到杨氏矩阵数组numbers的第i行第j列,即numbers[i][j],那么来判断一下find_number是否和numbers[i][j]相等,如果相等就找到了。如果find_number>numbers[i][j],根据杨氏矩阵的性质,它需要往下面走或者往右面走。如果find_number<numbers[i][j],根据杨氏矩阵的性质,它需要往上面走或者往左面走。但是要是这么以来的话,还需要考虑两个方向的移动。那么能不能在查找过程中只朝着某一个方向移动呢?答案是可以的,这就需要选好第一个查找位置,由于想要只能沿着一个方向移动,那么最开始的位置也只能是二维数组的四个角。那么选择哪一个角呢,假设选择numbers[0][0]这个角的话,如果find_number>numbers[i][j]的话,还是有两个方向可以移动(下和右)。选择numbers[row - 1][column - 1]这个角的话(row代表二维数组有多少行, column代表二维数组有多少列)可以做和上面类似的分析。那么,如果我们把初始的查找位置选择成numbers[0][column - 1]时,查找时将只有一个方向可以选择,如果find_number>numbers[i][j],那么查找路径需要向下查找,如果find_number>numbers[i][j],那么查找路径需要向左查找。初始路径选择numbers[row - 1][0]时可以做类似的分析。这么一来,时间复杂程度为O(row + column)。

在下面的程序实现时,只给出了初始位置选择numbers[0][column - 1]的情形。另一种情形读者可以自行完成。

三、程序实现

这里数据的范围可以参照参考资料1,即row和column都是1000以内,find_number的范围小于1000*1000,注意find_number类型的选取。

程序如下:

#include <stdio.h>

#define MAX_BUF 1024

int main(int argc, char *argv[])
{
	int row,
		column;
	long find_number = 0;
	int numbers[MAX_BUF][MAX_BUF];
	int i,
		j;

	while(EOF != (scanf("%d %d", &row, &column)))
	{
		scanf("%ld", &find_number);
		for(i = 0; i < row; i++)
			for(j = 0; j < column; j++)
				scanf("%d", &numbers[i][j]);

		int flag = 0;
		i = 0;
		j = column - 1;

		while(row > i && 0 <= j)
		{
			if(find_number == numbers[i][j])
			{
				flag = 1;
				break;
			}
			else if(find_number < numbers[i][j])
			{
				j--;
				continue;
			}
			else
			{
				i++;
				continue;
			}
		}
		flag == 1?
			(printf("find %ld,the row index: %d,the column index %d\n", find_number, i + 1, j + 1)):
			(printf("not find %ld\n", find_number));		
	}

	return 0;
}

四、测试结果



五、参考资料

1. 三月面试集训第1周回顾 杨氏矩阵查找:

http://hero.pongo.cn/Question/Details?ID=18&ExamID=18


说明:

如有错误还请各位指正,欢迎大家一起讨论给出指导。

上述程序完整代码的下载链接:
https://github.com/zeliliu/BlogPrograms/tree/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%26%E7%AE%97%E6%B3%95/yang%20matrix%20finding

最后更新时间:2013-05-04

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值