题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
既然数组每一行从左到右是递增的,每一列从上到下递增的,首先想到二分,但是,对于二维数组而言,采用二分查找,如果当前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)