面试题3:二维数组中的查找

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

原本思路:两个for循环判断,但这样没有考虑到题目要求的递增规则,不符合题意。

思路:

本题的关键点在于选取开始查找的位置,即矩阵的左上角数或右下角数。

如左上角数,查找数先与左上角数进行比较,如果相等,即查找成功,如查找数大于左上角数,则第一行不用再查找,如果查找数小于左上角,则最后一列不用再查找。依次....

这样每次判断就可以减少一行的判断量,这样最坏的情况,时间复杂度为:O(rows-1 + columns-1)

源代码

#include <stdio.h>
#include <stdlib.h>
bool Find(int** matrix,int rows,int columns);
bool Find(int** matrix,int rows,int columns,int number)
{
	bool found=false;
	if(matrix !=NULL && rows>0 && columns>0)
	{
		int row=0;
		int column=columns-1;
		printf("矩阵不为空!");
		while(row<rows && column >=0)
		{
			printf("正在查找...%d\n",matrix[row][column]);
			if(matrix[row][column]==number)
			{
				found=true;
				break;
			}
			else if(matrix[row][column]<number)
				row++;
			else	
				column--;
		}
	}
	return found;
}
int main()
{
	int i,j;
	int rows,columns;
	printf("输入行,列大小:");
	scanf("%d %d",&rows,&columns);
	//int **A=(int **) malloc (rows*columns* sizeof(int));
	int **A;
	A=new int *[rows];
	for(i=0;i<rows;i++)
		A[i]=new int[columns];
	printf("输入矩阵:");
	for(i=0;i<rows;i++)
	{
		for(j=0;j<columns;j++)
		{
			scanf("%d",&A[i][j]);
		}
	}
	printf("输入要查找的数:");
	int number;
	scanf("%d",&number);
	bool flag;
	flag=Find(A,rows,columns,number);
	if(flag==true)
		printf("已找到!");
	else
		printf("未发现!");	
	return 0;
}

结果

已找到!hadoop@master:~/algorithm/第二章$ g++ -c 03.cpp
hadoop@master:~/algorithm/第二章$ g++ 03.o -o 03
hadoop@master:~/algorithm/第二章$ ./03
输入行,列大小:4 4
输入矩阵:1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
输入要查找的数:7
矩阵不为空!正在查找...9
正在查找...8
正在查找...2
正在查找...4
正在查找...7
已找到!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值