二维数组中的查找

题目描述:

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

解题思路:

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

posted @ 2018-03-15 20:34  康小武  阅读(174)  评论(0编辑  收藏  举报