题解 | #二维数组中的查找#
二维数组中的查找
https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e
方法一:遇到大于目标的数字就终止遍历,进入下一列
基本思路:
将二维数组看成矩阵,如果第一行的第i个数字就比目标大,那么该列就可以直接跳过;反之,则从该列第一行元素开始,一个个往下比较(即比较array[k][i]和target,其中k=1,2,3,...)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param target int整型
* @param array int整型vector<vector<>>
* @return bool布尔型
*/
bool Find(int target, vector<vector<int> >& array) {
// write code here
for (int col = 0; col < array[0].size(); col++) {
// 按二维数组的列遍历
if (array[0][col] == target) {
return true;
}
if (array[0][col] < target) {
for (int row = 0; row < array.size(); row++) {
if (array[row][col] > target) break;
else {
if (array[row][col] == target) return true;
}
}
}
}
return false;
}
};
方法二:在方法一基础上加入折半查找
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param target int整型
* @param array int整型vector<vector<>>
* @return bool布尔型
*/
bool Find(int target, vector<vector<int> >& array) {
// write code here
for (int col = 0; col < array[0].size(); col++) {
// 按二维数组的列遍历
if (array[0][col] == target) {
return true;
}
if (array[0][col] < target) {
if (binary_find(array, col, target)) {
return true;
}
}
}
return false;
}
bool binary_find(vector<vector<int>> array, int col, int target) {
int low = 0, high = array.size() - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
int cur = array[mid][col];
if (cur == target) {
return true;
} else {
if (cur < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
}
return false;
}
};

