在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
思路:依照此數組的特點,可以用i, j分別表示行和列,為了效率更高,把i的初始值設為0,j的初始值設為array[0].size() - 1(即第一個與target比較的數為第0行的最后一個元素),這樣可以保證target比當前位置的數大,而恰好target值與同一行的某個數相等時,不會跳到下一行去,而是從右往左遍歷比較。
【即行i未確定時,每次與target比較的總是每一行的最大數,當target小于當前數時,說明與target相等的數就在該行(此時i不需再加1,j開始逐漸減1)】
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
for (int i = 0, j = array[0].size() - 1; i < array.size() && j >= 0; ) {
if (target == array[i][j]) {
return true;
}
if (target > array[i][j]) {
i++;
} else {
j--;
}
}
return false;
}
};
int main() {
int m, n;
cin >> m >> n;
vector<vector <int> > vec(m, vector<int>(n, 0));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> vec[i][j];
}
}
int target;
cin >> target;
Solution solution;
if (solution.Find(target, vec)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}