二维数组的查找
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题目分析
任何一道算法题,在拿到题目之后,都是首先从基础的题干入手,了不起我看不懂任何题干中的隐藏信息,我直接暴力求解,起码让自己有一定的思路,先能解决问题,对于笔试题目的编程,有可能由于测试用例的量级比较小,直接求解了。而且对于一般的问题(排除很明显的动态规划、或者贪心算法暗示,这种题目暴力法很可能达到指数复杂度)。最最最传统的暴力法没有意义,不做讲解,首先抓住题干中的行(列)内有序,大不了这个有序就可以使用二分查找,同时也要认清楚线性有序,有序基本上必然和二分查找分不开了。
暴力求解 O ( n l g n ) O(nlgn) O(nlgn)
首先来讲解暴力求解,如上分析,这个暴力求解不是指 O ( n 2 ) O(n^2) O(n2)复杂度的暴力求解,大不了对行内使用二分查找,这样就可以把行内的查找复杂度降低到 O ( n l g n ) O(nlgn) O(nlgn),但是这样最致命的缺点就是还有一个题干的信息没有用到,这就是列内也是有序的。
python代码如下:
class SolutionForce():
def Find(self, target, arrays):
for array in arrays:
if self.binaryFind1d(array, target, 0, len(array) - 1):
return True
return False
def binaryFind1d(self,array1d,target,beg,end):
# 这里只需要判断是否找到,一般二分查找返回的是索引
mid=(beg+end)>>1 # 右移一位,相当于除二
if target==array1d[mid]:
return True
if target<array1d:
return self.binaryFind1d(array1d,target,beg,mid-1)
else:
return self.binaryFind1d(array1d,target,mid+1,end)
核心代码是一个一维的二分查找,复杂度刚才分析过了,对一行进行查找是 O ( l g n ) O(lgn) O(lgn<