二维数组中的查找

写在前面:

牛客网剑指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;
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页