版权声明:转载请声名出处,谢谢 https://blog.csdn.net/u010591976/article/details/82012244
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题技巧(对于这个特殊的矩阵):
1-每次查找二维数组的右上角元素,进行区域的缩减(也可以查找左下角的元素)
1.1-选择右上角元素:
if 查找的数字 == 二维数组的右上角元素,找到,设置标记位结束
if 查找的数字 > 二维数组的右上角元素,删除该元素所在的那一行
if 查找的数字 < 二维数组的右上角元素,删除该元素所在的那一列1.2-选择左下角元素:
if 查找的数字 == 二维数组的右上角元素,找到,设置标记位结束
if 查找的数字 > 二维数组的右上角元素,删除该元素所在的那一列
if 查找的数字 < 二维数组的右上角元素,删除该元素所在的那一行
2-右上角或者左下角元素的选择
- 对于这个特殊的二维数组,选择相反的确定位置元素剔除,其他位置为不确定位置,需要进行查找的。一旦搜索的区域有重叠,行和列的遍历会变复杂,这是我们不希望看到的
'''
Creat by HuangDandan
2018-08-23
[email protected]
题目描述:
在一个二维数组中(每个一维数组的长度相同),
每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
关键:矩阵比较起始元素的厕
技巧:
1-返回列表的长度
list只支持len(), numpy.array同时支持len, size, shape, 注意看三者返回值的区别。
2-查找问题设置标记位flag
'''
#选择右上角元素
def Find1(target, array):
#获得二维数组的行和列大小
nCol = len(array[0]) #列数
nRow = len([a[0] for a in array]) #行数
m = nRow-1
n = nCol-1
flag = False #标记位,找到标记为True
#从二维数组的右上方元素进行比较,右上方是关键,其他三个角落开始,区域均有重叠
i, j = 0, n
while (i <= m) & (j >= 0): #易错,这里必须加括号
if target == array[i][j]:
flag = True
break
elif target > array[i][j]:
i, j = i+1, j
else:
i, j = i, j-1
return flag
#选择左下角元素
def Find2(target, array):
#获得二维数组的行和列大小
nCol = len(array[0]) #列数
nRow = len([a[0] for a in array]) #行数
m = nRow-1
n = nCol-1
flag = False #标记位,找到标记为True
#从二维数组的右上方元素进行比较,右上方是关键,其他三个角落开始,区域均有重叠
i, j = m, 0
while (i >= 0) & (j <= n): #易错,这里必须加括号
if target == array[i][j]:
flag = True
break
elif target > array[i][j]:
i, j = i, j+1
else:
i, j = i-1, j
return flag
if __name__ == "__main__":
array1 = [[1,2],[2,4],[5,6],[7,9]]
print(Find2(8, array1))
# print([a[0] for a in array1])
# nRow1 = len([a[0] for a in array1])
# print(nRow1)
# print(len([a[0] for a in array1]))