剑指offer---二维数组中的查找

本文介绍了一种解决剑指offer中二维数组查找问题的方法,利用数组的行和列递增特性,通过从左下角或右上角元素开始,采用类似于二分查找的策略,以O(m+n)的时间复杂度找到目标整数或确定其不存在。
摘要由CSDN通过智能技术生成

**题目描述**

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。


**解题思路**

刚拿到这道题,最简单的办法是二维数组全都遍历一遍,时间复杂度O(m*n)。但是好像排序的性质就浪费了哈。

进一步想一下,每一行都是排序的,是不是可以每行都用二分查找呢,当然可以,时间复杂度简化为O(mlogn).但是只用了行的排序,列的排序好像没用,因为列和行都是排序的。

我们这时候考虑左下角或者右上角的元素。我以左下角元素为例,该元素一定是他所在列的最大元素,是他所在行的最小元素。有了这个性质是不是好多了,那我们就让该元素跟target比较:

(1) 如果他比target小,那么他所在列的所有元素都比他小,我们可以去掉这一列。

(2) 如果他比target大,那么他所在行的所有元素都比他大,我们可以去掉这一行。所以每次值的比较,行-1或者列+1就可以了。话不多说,上C++代码!

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int i = array.size()-1, j = 0;
        while(j<array[0].size() && i>=0){
            if(array[i][j] == target) return true;
            else if(array[i][j] < target) j++;
            else i--;   
        }
        return false;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值