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

博客围绕在二维有序数组中查找整数展开。该二维数组每行从左到右、每列从上到下递增。介绍了两种查找思路,一是把每行看作有序数组用二分查找;二是利用数组递增规律,选右上角或左下角元素与目标值比较,通过移动行列位置缩小查找范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e
来源:牛客网

两种思路
第一种是:
把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案。

第一种是:
利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较。以右上角为例,当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col- -;当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++
(右上角)每次移动col和row位置相当于抛弃了当前col以右,row以上的所有行和列。在以a[row][col]为右上角元的子矩阵中再进行查找,直到要查找的元素位于当前子矩阵的右上角或把查找完整个矩阵没有找到,结束。

方法一:

bool Find(int target, vector<vector<int> > array) {

    for(int i = 0; i < array.size(); i++){
        int low = 0;
        int high = array[i].size() - 1;
        /*
      	牛客的编译器不能通过加入break/continue的语句,提示段错误;
        if(array[i][low] > target)
            break;
        if(array[i][high] < target)
            continue;
        */
        while(low <= high){
            int mid = (low + high)/2;
            if(array[i][mid] > target)
                high = mid - 1;
            else if(array[i][mid] < target )
                low = mid + 1;
            else{

                return true;
            }

        }

    }
    return false;
}

方法二:

bool Find(int target, vector<vector<int> > array) {
    int rows = 0;
    int cols = array[0].size()-1;


    while(rows < array.size() && cols >= 0){
        if(array[rows][cols] == target)
            return true;
        if(array[rows][cols] > target)
            cols--;
        if(array[rows][cols] < target)
            rows++;
    }
    return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值