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

二维数组中的查找

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&&tqId=11154&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

![题目:二维数组中的查找](https://uploadfiles.nowcoder.com/images/20200602/230393819_1591110986786_4BB6110CB25F5AA2574329A1F1B9F8DF "图片标题")
解题思想:
由题目可得,其每一行从左到右依次递增,最右元素为行最大,其每一列从上到下依次递增,最下元素为列最大,所以在比较的时候
我们可以使用类二分思想,从一个较大元素开始判断,即从右上角和左下角的元素开始判断

1.右上角元素:列数初始值为arr.size()-1,行数初始值为array.s
目标值>右上角元素:即大于其所在行的所有元素,所以我们可以行数++,即跳过这一行,扫描方向:下
目标值<右上角元素:即小于其所在列的所有元素,所以我们可以列数 - -,即跳过这一列,扫描方向:左
2.左下角元素:列数初始值为0,行数初始值为array.size()-1
目标值>左下角元素:即大于其所在列的所有元素,所以我们可以列数++,即跳过这一列,扫描方向为:右
目标值<左下角元素:即小于其所在行的所有元素,所以我们可以行数 - -,即跳过这一行,扫描方向为:上
代码如下:
右上角

class Solution {
public:
    bool Find(int target, vector&lt;vector&lt;int&gt; &gt; array) {
       //
        int rows = array.size();
        if (rows == 0)
            return false;
        int cols = array[0].size();
        if (cols == 0)
            return false;
        int i = 0;
        int j = cols - 1;
        //循环条件
        while (i != rows &amp;&amp; j&gt;=0)
        {
            //判断相等
            if(target == array[i][j])
                return true;
            else if (target &gt; array[i][j])
                i++;
            else
                j--;
        }
        return false;
    } 
};

左下角

class Solution {
public:
    bool Find(int target, vector&lt;vector&lt;int&gt; &gt; array) {     
       //
        int rows = array.size();
        if (rows == 0)
            return false;
        int cols = array[0].size();
        if (cols == 0)
            return false;
        //取左下角元素
        int i = rows-1;
        int j = 0;
        //循环条件,从左下角开始判断
        while (i&gt;=0 &amp;&amp; j!=cols)
        {
            //判断相等
            if(target == array[i][j])
                return true;
            else if (target &gt; array[i][j])
                j++;
            else
                i--;
        }
        return false;
    } 
};
全部评论

相关推荐

点赞 评论 收藏
分享
💼公司岗位&nbsp;tx客户端岗本人背景中九硕,cpp选手。当时在牛子上看cpp选手找不到后端岗实习,遂投了腾子的客户端想练练手。🕐面试过程投递之后很快约面了,一面面试官比较和蔼问的也是正常八股加项目的模式。然后约了二面,二面面试官应该是入职后的leader,这轮面试就离谱了,一开始问了一些八股(感觉那面试官也不怎么懂技术像是照着书上写好的问题问一样),后面离谱的来了,直接疯狂压力测试(你为什么觉得你能xxx,你能不能接受xxx)。当时因为对tx还有滤镜,把自己当作一个牛马的姿态来回答这些问题。面完之后面试官可能觉得我是一个合格的牛马,他加了我微信,问我什么时候能去实习,我说六月初,他说有点晚了,然后考虑了一天还是给我过了面试,然后3面和hr面就也是正常流程了。🐶事件起因5月末的时候导师临时给安排了一个项目,于是我就去微信问那个leader,能不能推迟到6月24入职,如果不能我可以主动放弃offer,他当时犹豫再三还是同意了(现在回想起来可能是当时还没有备胎)。就在昨天他又问我什么时候入职,然后我说24号,他说有点晚叫我看看系统上还有没有其它入职时间,因为我还没在系统上填入职信息(在牛子上看到说只有快入职了,才会有人审核,遂想端午节后再填),查看不了可申请入职的时间。和他说了原因后,这下给他抓到把柄了,直接来一句&amp;quot;你对这次实习并不重视,确实没什么必要了&amp;quot;&nbsp;&nbsp;😅。感觉应该是找到备胎硬气了,就想把我踹走。不过爷也不想去了,客户端前景本来就不太好,这个leader也是个pua怪加压力怪,反正也是双向选择。最后再给大家一个建议,在面试过程中就感觉不舒服的组,一定不要去了,去了也只会更难受。 #不给转正的实习,你还去吗#&nbsp;&nbsp;#找实习多的是你不知道的事#
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务