二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入输出示例
示例1
输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true
示例2
输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
说明:不存在3,返回false
解题思路
array = [ [1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15] ]
数组内元素值从左往右,从上到下递增
从数组中第一行i=0最后一列j=len(array[0])-1所定位的元素value=array[i][j]开始比较,
如果当前value值等于目标值target,则直接返回True;
如果当前value值大于target,由于数组递增性质,value所在行以后的行中元素均大于当前value,则说明value所在行以后的行中一定不会存在与target值相等的元素,即改变列,j-1,当前行向前遍历比较;
如果当前value值小于target,由于数组递增性质,当前行下,value所在列以前的列中元素均小于当前value,则说明当前行下value所在列以前的列中一定不会存在与target值相等的元素,即改变行,i+1,向下循环比较;
代码示例
class Solution():
def find(self, target, array):
row_count = len(array) # 二维数组的行数
col_count = len(array[0]) # 二维数组的列数
i = 0 # 初始化 i从0开始 第一行
j = col_count -1 #j从最后一列开始
# 循环条件:行遍历到最后一行结束(只要i小于最大行下标就继续遍历)
# 列遍历到第一列结束(只要列大于第一列下标就继续遍历)
while i < row_count and j>= 0:
value = array[i][j] # 所遍历到的数组中的值
if value == target:
# 如果当前值等于目标值,返回True
return True
elif value > target:
# 如果当前值大于目标值,因为由上往下递增,
# 所以该行以后的行中不存在与其相等的值
# 当前列-1,即改变列,从后往前遍历当前行中的值
j -= 1
else:
# 如果当前值小于目标值,因为由左往右递增,
# 所以该行整行中不存在与其相等的值
# 行+1,即改变行,从上往下遍历当前列中的值
i += 1
return False
if __name__ == '__main__':
s = Solution()
target = 11
array = [
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
result = s.find(target, array)
print(result)