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

本文介绍了一种在特殊排序的二维数组中查找特定整数的方法。通过从数组的右上角开始,逐步排除不可能包含目标值的行列,最终定位目标值。此算法高效地解决了查找问题。

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

题目描述

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

例子输入:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

输入整数:7

输出:true

分析:首先我们选取数组右上角的数字9,并且9是第4列最小的数字,9>7,7不会出现在第四列。于是第4列从需要考虑的区域内剔除。
1 2 8
2 4 9
4 7 10
6 8 11
在剩下的矩阵中,右上角的数字是8,同样8大于7,因此剔除第3列。
1 2
2 4
4 7
6 8

在剩余的两列数组中,数字2位于数组的右上角。2小于7,那么要查找的7可能在2的右边,也有可能在2的下边。在前面的步骤中,我们已经剔除2右边的列,因此7只有可能出现在2的下边。于是我们把数字2所在的行也剔除,只分析剩下的三行两列数字。
2 4
4 7
6 8

在剩下的数字中,数字4位于右上角,4小于7,把数字4所在的行也剔除。最后只剩下两行两列的数字。在剩下的数字中,位于右上角的刚好就是我们要查找的数字7,查找过程结束。返回true
4 7
6 8
总之就是:从有效区域数组的最右上角的那个数字(假设为X)着手考虑,若X>要查找的数字,就剔除当前X所在的列;若X<要查找的数字,就剔除X所在的行。每一次都从有效数组的最右上角考虑。

bool Find(int target, vector<vector<int> > array) {
        int rows = array.size();          //二维数组的行数
        int cols = array[0].size();       //二维数组的列数
        bool found = false;               //标记初始化为false
        int row = 0, col = cols -1;        //从数组的最右上角的数字开始查找
        while (row < rows && col >= 0)   
       {
            if(array[row][col] == target)  
                {
                    found = true;
                    break;
                }
             else if(array[row][col] > target)   //若当前右上角的数字大于target,剔除这一列
                     --col;

             else                           //若当前右上角的数字大于target,剔除这一行
                    ++row;          
        }
         return found;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值