CI9.6-在特殊的矩阵中找给定的数

38 篇文章 0 订阅
38 篇文章 0 订阅

给定一个整数的二维数组,其中每行从左到右升序,每列从上到下递增。实现一个方法返回给定数在数组中的下标。

思路:

可以顺序查找,但是这样就没有利用升序的条件。因为行列都是有序的,所以通过一次比较尽可能排除一行或一列。如果从数组左上角开始比较,若给定数大于左上角的数,那么无法确定剔除这一行还是这一列。如果从数组右上角比较,若给定数较大,则可以剔除这一行,若给定数较小,则可以剔除这一列。当然也可以从左下角的数开始比较,不能从右下角开始比较。

#include <iostream>
#include <vector>
using namespace std;

int Find(const vector<int>& ivec, int row, int column, int num)
{
	if (ivec.size() == 0)
		return -1;
	int i = 0, j = column -1;
	while (i < row && j >= 0)
	{
		int index = i * column + j;
		if (ivec[index] == num)
			return index;
		else if (ivec[index] < num)
			++i;
		else
			--j;
	}
	return -1;
}

int main()
{
	int r, c;
	vector<int> ivec;
	while (cin >> r)
	{
		cin >> c;
		int n;
		for (int i = 0; i < r * c; ++i)
		{
			cin >> n;
			ivec.push_back(n);
		}
		cin >> n;
		cout << Find(ivec, r, c, n) << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值