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