给定一个整数的二维数组,其中每行从左到右升序,每列从上到下递增。实现一个方法返回给定数在数组中的下标。
思路:
可以顺序查找,但是这样就没有利用升序的条件。因为行列都是有序的,所以通过一次比较尽可能排除一行或一列。如果从数组左上角开始比较,若给定数大于左上角的数,那么无法确定剔除这一行还是这一列。如果从数组右上角比较,若给定数较大,则可以剔除这一行,若给定数较小,则可以剔除这一列。当然也可以从左下角的数开始比较,不能从右下角开始比较。
#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;
}