zoukankan      html  css  js  c++  java
  • 二维数组中的查找

    题目描述:

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

    解题思路:

      既然数组每一行从左到右是递增的,每一列从上到下递增的,首先想到二分,但是,对于二维数组而言,采用二分查找,如果当前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)

  • 相关阅读:
    台州 OJ 3847 Mowing the Lawn 线性DP 单调队列
    洛谷 OJ P1417 烹调方案 01背包
    快速幂取模
    台州 OJ 2649 More is better 并查集
    UVa 1640
    UVa 11971
    UVa 10900
    UVa 11346
    UVa 10288
    UVa 1639
  • 原文地址:https://www.cnblogs.com/wktwj/p/8576020.html
Copyright © 2011-2022 走看看