二维数组中的查找

Posted 做1个快乐的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组中的查找相关的知识,希望对你有一定的参考价值。

二维数组中的查找(点击链接进入题目)

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
  现有矩阵 matrix 如下:
  [
   [1, 4, 7, 11, 15],
   [2, 5, 8, 12, 19],
   [3, 6, 9, 16, 22],
   [10, 13, 14, 17, 24],
   [18, 21, 23, 26, 30]
  ]
给定 target = 5,返回 true。
给定 target = 20,返回 false。

题目分析:数组是一个二维数组,我们查找的过程本质就是排除的过程,我们要找到给定的target,就要排除那些不是target的元素。怎么排除才能高效排除是我们的关键。

法一:遍历整个二维数组,然后将每个元素分别于target比较,找到是否含有target。
该方法效率较低,具有O(N)的时间复杂度,不推荐。

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        for(size_t i = 0; i < matrix.size(); i++)
        {
            vector<int> tmp = matrix[i];
            for(size_t j = 0; j < tmp.size(); j++)
            {
                if(tmp[j] == target)
                    return true;
            }
        }
        return false;
    }
};

法二:我们遍历整个数组依次遍历,本质一次只能排除一个,我们观察条件,数组的每一行从左到右是递增的,每一列从上到下是递增的,我们利用这个规律,选取右上角元素为标志位,因为右上角元素是该行最大的元素,该列最小的元素,如果target大于右上角元素,说明target一定不在该行;如果target小于右上角元素,说明target一定不在该列;这样一次排除一行或一列,效率得到提升。
  而终止的临界条件无非就是找到和找不到:
    a:找到,比较结果,相等即找到,输出即可。
    b:找不到,行或者列出现越界。

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        //如果matrix这个数组为空,直接返回flase
        if(matrix.empty())
            return false;
            
        int i = 0;//i表示行
        int j = matrix[0].size() - 1;//j表示列
        //将i、j定位在右上角的位置

        while(i < matrix.size() && j >= 0)
        {
            if(target < matrix[i][j])
                //此时表明目标值一定不会出现在这一列,因为这一列的数字一定比右上角的大,目标值比右上角要小,所以一定不会出现在该列
                j--;
            else if(target > matrix[i][j])
                //此时表明目标值一定不会出现在这一行,因为这一行的数字一定比右上角的小,目标值比右上角要大,所以一定不会出现在该行
                i++;
            else
                return true;
        }
        return false;
    }
};

以上是关于二维数组中的查找的主要内容,如果未能解决你的问题,请参考以下文章

二维数组中的查找

6-二维数组中的查找

剑指offer04二维数组中的查找

二维数组中的查找

[剑指Offer]5.二维数组中的查找

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