• 二维数组中的查找


    题目描述:

      在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    解题思路:

      既然数组每一行从左到右是递增的,每一列从上到下递增的,首先想到二分,但是,对于二维数组而言,采用二分查找,如果当前A[i][j] > target,这种情况是比较好办的,因为我们将搜索区域缩小为(i,j)左上角的矩形区域,此时比较容易确定下一次搜索的的位置。但是,如果A[i][j] < target,那么我们搜索的区域变为(i,j)左侧和下方的区域,此时就比较麻烦了,类似于一个L形的区域,层数浅还可以,层数很深的话,搜索区域会越来越复杂,因此二分不合适。

      我们不妨确定一个搜索起点,我们可以确定A[i][j] 和 target的关系,根据这个关系,下一次搜索的区域还是个矩形,那就意味着,我们每次可以删掉一行或者一列,选取右上角元素为起点,如果当前A[i][j] > target,那么target肯定不会位于j这一列,我们就让j--。同理如果当前A[i][j] < target,那么target肯定不会位于i这一行,我们就让i++。知道找到元素或者试图去越界的位置搜索。

    代码:

     1 class Solution {
     2 public:
     3     bool Find(int target, vector<vector<int> > array) {
     4         int rh = array.size() - 1;
     5         int ch = array[0].size() - 1;
     6         int m = rh;
     7         int n = ch;
     8         int rl = 0;
     9         int cl = 0;
    10         while(ch >= 0 && rl < m)
    11         {
    12             if(array[rl][ch] == target)
    13                 return true;
    14             if(array[rl][ch] > target)
    15                 ch--;
    16             if(array[rl][ch] < target)
    17                 rl++;
    18         }
    19         return false;
    20     }
    21 };

    算法时间复杂度为O(m + n)

  • 相关阅读:
    MongoDB 4.0.10 CRUD操作(增删改查)
    MongoDB 4.0.10 聚合
    MongoDB 4.0.10 索引
    MongoDB 4.0.10 导出、导入,备份、恢复
    MongoDB 4.0.10 监控
    列及注释
    SecureCRT的shell中文乱码
    oracle 判断是否是日期
    查询oracle服务器的版本
    Oracle中connect by 的执行结果记载
  • 原文地址:https://www.cnblogs.com/wktwj/p/8576020.html
Copyright © 2020-2023  润新知