剑指Offer --二维数组中的查找

 

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

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

样例

输入数组:

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

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

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


class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        
   
     // 填写代码     
    }
};

解题思路: 

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

               我们可以看到这个矩阵的规律是按行从左到右递增,按列从上到下递增, 核心就在左下角,样例中给出的数据  6 是

               矩阵的最左下角的元素,它是所在行的最小元素, 也是所在列的最大元素, 利用这一点,我们从该位置进行枚举.

               假设 我们现在枚举的位置的数 为 x  , 如果  x  == target(我们要查找的数) , 那就找到了 .   如果  x > target 那么,

               是不是就要从所在列 , 从下往上 找 比 x  小的.   否则如果  x < target  ,那么,我们就要往右继续 枚举 直到找到该元素. 

         

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        
       if (array.empty() || array[0].empty())
       return false;
       int n = array.size();  // 行 ; 
       int m = array[0].size() ; // 列; 
       int r = n -1  ; 
       int c = 0 ; 
       
       while(r>=0 && c< m )
       {
           if(target == array[r][c])
           {
               return true  ;
           }
           else if (target < array[r][c])
           {
               // 如果要查找的那个数要比当前 array[r][c]的数 要小的话,就向上查找
               r-- ;
           }
           else
           {
               // 往右走;
               c++ ; 
           }
         
       }
       return false ; 
        
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值