在一个二维数组中判断给定整数是否存在,要求在O(n)内实现

题目描述:在一个二维数组中,每一行元素从左到右递增,从上到下递增,现输入一个整数,判断数组中是否存在该整数,要求时间复杂度为O(n)

思路:可以数组分为三个部分,数组右上角,左边,下面

例如:数组如下

1  2  8    9

2  4  9   12

4  7  10 13

6  8  11 15

查找元需为7,数组右上角元素为9

因为7<9,则在9左边的三列中寻找7元素,将col减1

1  2  8

2  4  9

4  7  10

6  8  11

再取数组右上角元素8,7<8,则在8左边的两列中寻找7元素,将col减1

1  2

2  4

4  7

6  8

再取数组右上角元素2,7>2,则在2下边三行中寻找元素7,注意此时的3行,值

2  4 

4  7

6  8,前面已经将col至2啦

再取数组的右上角元素4,7>4,则在4下边2行中寻找

4  7

6  8

再取数组的右上角元素7,7==4,返回,查找成功


具体实现代码如下:

//array(实质为二维数组)数组的特征:从左到右递增,从上到下递减
//思路:先将num与右上角的元素相比较,相等则直接返回,表示找到
//小于,则在左边的列寻找,将列数减一
//大于,则在下放元素寻找,将行数增一
bool find_num(int *array, int *index, int rows, int cols, int num)
{
	bool flag=false;
	//int temp = array[col-1];
	if(array!=NULL && cols>0 && rows>0)		//判断参数的有效性
	{
		int row=0, col=cols-1;		//与右上角的数字比较
		while(array!=NULL && row<rows && col>0)
		{
			if(num==array[row*cols+col])
			{
				flag=true;
				index[0] = row;
				index[1] = col;
				break;
			}
			else if(array[row*cols+col]>num)
				--col;
			else
				++row;
		}
	}
	return flag;
}

int main(void)
{
	int index[2] = {0};
	int array[]={1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15};
	bool ret = find_num(array, index, 4, 4, 7);
	cout << ret << " " << index[0] << " " << index[1] << endl;
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值