题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入示例 :5,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
输出示例 :false
可复习的知识点: 基础输入输出操作、二分查找
思路1:
由于数组按行递增,可以按行查找,然后行内二分。时间复杂度O(nlogn)。注意: 1. 需要对输入进行字符串提取值的处理,否则在判等时5会和15之中的那个5相等从而发生误判。如果要print结果,false和true都是小写。 2.二分查找有两种写法,递归法和普通flag法,要注意结束条件的判断。3.当然可以不用二分查找,直接用python的内建函数in进行判断。
Python题解
class Solution:
# array 二维列表
def Find(self, target, array):
for line in array:
if self.binaryFind(line,target): #if target in line: #改成这句之后下面定义的二分查找就可以不用了
return 'true'
return 'false'
def binaryFind(self,line,tar):
if len(line)==0:
return False
mid=len(line)//2
if tar==line[mid]:
return True
elif tar>line[mid]:
return self.binaryFind(line[mid+1:],tar)
else:
return self.binaryFind(line[:mid],tar)
while True:
try:
input=list(eval(raw_input()))
target=input[0]
array=input[1]
S=Solution()
print(S.Find(target,array))
except:
break
C++题解:
思路2:
从数组的左下角开始查找。每个左下角拐角处的数都有这样的特点:跟它一行的都比它大,跟它一列的都比它小。所以每次用target的数跟它进行比较,就能排除对某一行或某一列的查找。注意while循环终止条件。
class Solution:
# array 二维列表
def Find(self, target, array):
rows=len(array)-1
cols=len(array[0])-1
i=rows;j=0
while i>=0 and j<=cols:
if target==array[i][j]:
return True
elif target>array[i][j]:
j=j+1
else:
i=i-1
return False