题意:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
分析:
因为是有序数组,首先想到的是用二分查找,每次可以过滤掉不符合要求的一半,但是分割成四个象限后第一象限和第三象限的大小无法确定,有点费事,弃之。
后来参照网上比较好的一种写法:牛客
- 来看一下数据的特性:
- 每一行都按照从左到右递增的顺序排序
- 每一列都按照从上到下递增的顺序排序
- 翻译成自己的话:
左下角是该行最小的值,该列最大的值。
- 做题思路:
从左下角(假设左下角的数值为m)开始,用target与一行中的最小值与一列中的最大值进行比较,依次比较可以剔除一整行或一整列。
- m > target:m已经是该行最小的值,想要更小的只能从行的角度考虑,故上移一行。
- m < target:m已经是该列最大的值,想要更大的只能从列的角度考虑,故右移一列。
- m = target:成功找到
代码:
def Find(target, array):
rows = len(array)
cols = len(array[0])
if rows == 0 or cols == 0:#处理边界条件
return False
row = rows - 1, col = 0#从左下角开始比较
while row >= 0 and col < cols:
if array[row][col] == target:
return True
elif array[row][col] > target:
row -= 1
else:
col += 1
return False