【刷题】剑指offer--二维数组中的查找

最近要开始刷数据结构与算法题,曾经被今日头条笔试代码和面试手写代码虐哭,就不能友好地手写一些排序这样简单的算法吗

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

最最naïve的做法就是每行做二分查找了,然后还可以对列先做一个二分查找来删除一些行,但显然这样的复杂度还是很高的,想想这个没有利用什么特性。那对于给定的二维数组,在二分的时候没有把行递增和列递增一起考虑,这样题目给这个二维数组就显得没那么大意义了。那为了在一次操作中同时利用行递增和列递增,其实最简单的就是比较操作啦。
然后想一想就能发现每次只要比较最右上角的元素,如果大于该元素,就可以删掉一行,小于该元素,就可以删掉一列。这样的时间复杂度就是O(m+n)的,手写代码如下:

bool find(int a[][], int m, int n, int target)
{
    bool found = false;
    int tmpm = 0;
    while(tmpm < m && n > 0)
    {
        if(target = a[tmpm][n-1])
        {
            found = true;
            break;
        }
        else if(target > a[tmpm][n-1])
            tmpm++;
        else
            n--;
    }
    return found;
}

手写过程7分钟左右,中间有一定涂改。这个类型的面试题的话就还算好,我比较怕数据结构。

昨天听毛不易的歌的时候看到一句话—-初闻不知曲中意,再听已是曲中人。自己遐想吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值