在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
【1】二分查找
从左上角或右下角位置上的数与target比较,删除行或列
选择右上角,大于target删除这一列;小于target删除这一行
选择左下角,大于target删除这一行;小于target删除这一列
时间复杂度O(n+m),空间复杂度O(1)
python的list没有length()或shape(),需要转为numpy再用shape(): np.array(listA).shape
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
# array: m*n
m = len(array[0])
n = len(array)
# 选择右上角
x = n-1
y = 0
while(x>=0 and y<m):
if array[x][y]==target:
return True
elif array[x][y]>target:
x-=1
else:
y+=1
return False
# 选择左下角
x = 0
y = m-1
while(y>=0 and x<n):
if array[x][y] == target:
return True
elif array[x][y] > target:
y-=1
else:
x+=1
return False
【2】对每一行二分查找,时间复杂度O(nlogn),空间复杂度O(1)
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
for i,row in enumerate(array):
low = 0
high = len(row)-1
while(low<=high):
mid = (low + high-1)/2
if target > array[i][mid]:
low = mid +1
elif target < array[i][mid]:
low = mid -1
else:
return True
return False
时间复杂度过高,未通过