剑指offer:二维数组中的查找(C语言)

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

分析:首先想到的是遍历整个数组,这样肯定能找出来,但是那样的时间复杂度就是O(n)了。按照常规来说,这个是不可取的。既然这是一个有规律的数组,那么我们可以找到一个突破口,如果我们找这个数组的左上角或者右下角的值,这两个值都是最小或者最大的值,然后其所在行或列要么都比它小,要么都比它大,根本不能有效的去缩小范围。如果选择右上角或者左下角,则能达到整行或整列排除的目的。
以右上角为例,如果第一个值大于要找的值,则能排除整列,这时就可以往左来缩小范围了,直到找到的第一行的那个值小于它,就可以在该列中往下找,因为在同一行中,它所在的列是最大的那个值,所以它一直可以往下移,知道碰到大于或等于它的值,如果大于它,它有可以往同一行的左边移动了,如此进行,就能找到它所对应的那个值了。

代码如下
 

int Find(int *matrix,int rows,int columns,int number){
	int found = -1;
	
	if(matrix != NULL && rows > 0 && columns > 0){
		int row = 0;
		int column = columns - 1;
		while(row < rows && column >= 0){
			if(matrix[row * columns + column] == number){
				found = 1;
				break;
			}
			else if(matrix[row * columns + column] > number){
				--column;
			}
			else
				++row;
		}
	}
	return found;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值