七周打卡剑指offer《二维数组中的查找》

Posted JunMain

tags:

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

二维数组中的查找

题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

样例

输入数组:

[
  [1,2,8,9],
  [2,4,9,12],
  [4,7,10,13],
  [6,8,11,15]
]

如果输入查找数值为7,则返回true,

如果输入查找数值为5,则返回false。

暴力做法 O( n 2 n^2 n2)

思路
先扫描第一行找出比target小的最大数字记录下标k1
再扫描第一列找出比target小的最大数字记录下标k2
然后两重循环遍历数组

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        if (array.empty() || array[0].empty())  return false;
        
        int m = array.size(),  n = array[0].size();
        int k1, k2;
        
        for (int i = 0; i < n; i ++)    if(array[0][i] <= target)   k1 = i;
        if(array[0][k1] == target)   return true;
        
        for (int i = 0; i < m; i ++)    if(array[i][0] <= target)   k2 = i;
         if(array[k2][0] == target)   return true;
         
        for (int i = 0; i <= k2; i ++)
            for (int j = 0; j <= k1; j ++)
                if(array[i][j] == target)   return true;
        return false;
    }
};

单调性扫描法 O( m + n m+n m+n)

最右上方 x x x有这一个性质:
左边的数都比 x x x小, 下边的数都比 x x x
x > t a r g e t x > target x>target x x x 下方的数字都比 t a r g e t target target j j j --(找更小的)
x < t a r g e t x<target x<target x x x 左边的数字都比 t a r g e t target target i i i ++(找更大的)

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        if (array.empty() || array[0].empty())  return false;

        int i = 0, j = array[0].size()-1;

        while (i < array.size() && j >= 0)
        {
            if (array[i][j] == target)  return true;
            if (array[i][j] > target)  j --;
            else i ++;
        }

        return false;
    }
};


以上是关于七周打卡剑指offer《二维数组中的查找》的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer打卡04.二维数组中的查找

剑指Offer打卡目录(Java实现)

乱序版 ● 剑指offer每日算法题打卡题解—— 查找算法 (题号3,4,11,53)

七周打卡剑指offer《旋转数组中最小的数字》

七周打卡剑指Offer《找出数组中重复的数》

七周打卡剑指offer《不修改数组找出重复的数》