剑指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;
    } 
};
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务