写在前面:
牛客网剑指offer的日记文。算法总结是参考牛客网评论后自己的理解与整理。萌新会尽量著明引用出处,侵权必删。
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题目理解:
二维数组查找题。暴力求解最坏时间复杂度:O(n^2)。可以考虑剪枝、二分(查找题万年王道)。
下面介绍O(n)解法:
选取右上(左下)为初始点,逐步向左下(右上)靠拢。(保证当前点的移动无歧义)
以右上为例row = 0, col = n。若target < array[row][col],col --,反之,row ++。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row = 0, col = array[0].size() - 1;
while(row < array.size() && col >= 0){
if(target == array[row][col]) return 1;
else if(target < array[row][col]) col --;
else row ++;
}
return 0;
}
};
下面介绍二分解法:
遍历行,在行中使用二分查询。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
for(int i = 0; i < array.size(); i ++){
int low = 0, high = array[i].size() - 1, mid;
while(low <= high){
mid = (low + high) / 2;
if(array[i][mid] == target) return 1;
else if(array[i][mid] > target) high = mid - 1;
else low = mid + 1;
}
}
return 0;
}
};
总结:二分查找
bool BinarySearch(int target,vector<int> v){
int low = 0, high = v.size(), mid;
while(low <= high){
mid = (low + high) / 2;
if(v[mid] == target) return true;
else if(v[mid] < target) low = mid + 1;
else high = mid - 1;
}
return false;
}