例题
描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0 \le n,m \le 5000≤n,m≤500 , 矩阵中的值满足 0 \le val \le 10^90≤val≤10
9
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
示例1
输入:
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
复制
返回值:
true
复制
说明:
存在7,返回true
示例2
输入:
1,[[2]]
复制
返回值:
false
复制
示例3
输入:
3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
复制
返回值:
false
复制
说明:
不存在3,返回false
解决方案
问题分析:
找出某数是否在二维数组中,观察给出的示例,每一行都是从小排到大,那么我们为了节省查询效率,直接跟每一行最大的比
如果小于最大的,往前推,如果大于最大的,则直接进行下一行,减少查询次数
def find(target, array):
# 行
rows = 0
# 因为每一个一维数组的长度都相同,那么直接用第一个数组的长度,python中数组的长度是定长,1,2,3就是3,但是我们数组是从0开始计数
rows_len = len(array[0]) - 1
# 判断循环
flag = True
# 用二维数组行来做循环
while rows < len(array) and rows_len >= 0:
# 拿到每一行最大的元素
base = array[rows][rows_len]
if target == base: # 如果恰好找到,就直接返回
return True
elif target > base: # 如果给出的数比每一个最大的还大,直接下一行查找
rows += 1
else: # 如果小于某一个最大的数,往前推推看
rows_len -= 1
return False
总结
遇到这种题,先观察示例,一般遇到二维数组,第一时间我就想到了for循环,但是当我看到时间复杂度和空间复杂度之后,就明白急不得
参考资料
https://github.com/nlpjoe/Coding4Interviews