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)

  • 相关阅读:
    java 算法最长连续递增子序列
    java 算法最长连续递增序列
    最大连续子数组和(Java)
    mysql时间序列与窗口函数
    CSS控制br高度
    小知识随手记(九):兄弟选择器(~和+)区别
    VUE组件递归实现自定义目录及拖拽效果
    VUE的插件解析
    VUE的mixin混入解析
    VUE高阶组件解析
  • 原文地址:https://www.cnblogs.com/wktwj/p/8576020.html
Copyright © 2011-2022 走看看