《剑指Offer》读书笔记01:二维数组中的查找

《剑指Offer》读书笔记01:二维数组中的查找


题目描述

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


解题思路

1.按照题目描述构建一个符合题意的数组(m*n)如

int Input[6][7] = {
    {11, 12, 13, 14, 15, 16, 17},
    {15, 16, 17, 18, 19, 20, 21},
    {31, 32, 33, 34, 35, 36, 37},
    {34, 35, 36, 37, 38, 39, 40},
    {51, 52, 53, 54, 55, 56, 57},
    {61, 62, 63, 64, 65, 66, 67},
};

2.最简单直接粗暴的方法,从第一个往最后一个比较,最坏情况下需要比较m*n次,不宜。

3.不想一个一个遍历,那么有没有办法实现直接跳过一行或者一列呢?

假如从左上角开始,要查找的数是17,而17比11大,根据题意,可能在11的右边或者下面,但是不能确定,所以不能实现跳过一行或者一列。

假如从右上角开始,要查找的数是35,而35比17大,根据题意,17左边的数一定不大于17,所以我们可以直接往下跳一行,从下一行的21开始查找,21依然小于35,跳过21所在行,从下一行的37开始查找,35比37小,此时观察37所在列,37上面的数已经比较并跳过,而下面的数字都比37大,所以我们可以往左跳一列到36。接下来同理。

同理可以从左下角开始。


参考代码

bool Find(vector<vector<int> > array,int target) {
    int rows = array.size();//获取行数
    int columns = array[0].size();//获取列数

    if ( rows == 0 || columns == 0 ) {
        return false;
    }
    if ( target < array[0][0] || target > array[rows-1][columns-1] ) {
        return false;
    }

    int row = 0;//当前行
    int column = columns - 1;//当前列

    while ( row <= rows - 1 && column >= 0 ) {
        if ( array[row][column] == target ) {
            return true;
        } else {
            if ( array[row][column] > target ) {
                column--;//往左跳一行
            } else {
                row++;//往下跳一行
            }
        }
    }
    return false; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值