面试题4:二维数组中的查找

一、题目

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

    例如下面二维数组就是每行、每列都是递增序列,如果在这个数组中查找数字7,则返回true; 如果查找数字5, 由于数组不含有该数字,则返回false。

$$ \begin{matrix} 1 & 2 & 8 & 9\\ 2 & 4 & 9 & 12 \\ 4 & 7 & 10 & 13 \\ 6 & 8 & 11 & 15 \end{matrix} \tag{1}$$

二、解法

    思路:假设要查找7。 首先我们选取数组右上角的数字9, 由于9大于7,并且9还是第4列的第一个(也是最小的)数字,因此7不可能出现在数字9的列。于是我们把这一列从需要考虑的区域中提出,之后只需要分析剩下的3列。再生侠的矩阵中,位于右上角的数字是8。同样8大于7,因此8所在的列也可以剔除, 在剩下的两列组成的数组中,数字2位于数组的右上角。2小于7,那么要查找的7可能在2的右边,也可能在2的下边。在前面的步骤中,我们已经发现2右边的列都已经被剔除了,也就是说7不可能出现在2的右边,因此7只能出现在2的下面,于是我们把2所在的行剔除,值分析剩下的三行两列数字,在剩下的数字中4位于右上角,和前面一样,把数字4所在的行删除,剩下两行两列数字。再剩下的数字中,位于右上角的刚好就是我们要查找的7,于是查找过程结束,返回true。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        // array是二维数组,这里没做判空操作
        int rows = array.size();
        int columns = array[0].size();
        int i = 0, j = columns-1;//右上角元素坐标
        while(i<rows && j>=0)
        {
            if(array[i][j] == target)
                return true;
            else if(array[i][j] > target)
                --j; //查找的元素小于右上角元素,删列操作
            else
                ++i; //查找的元素大于右上角元素,删行操作
        }
        return false;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值