题目:
在一个二维数组中(每个一维数组的长度相同),
每一行都按照从左到右递增的顺序排序;
每一列都按照从上到下递增的顺序排序;
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思考:
什么是二维数组?
直观的想到矩阵,实际上python当中没有数组的概念, 而是列表(List), 二维列表相当于二维数组 。
如下:

1
2
3
4

import numpy as np
array = np.array([[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]])
array#
array([[ 1,  2,  8,  9],
       [ 2,  4,  9, 12],
       [ 4,  7, 10, 13],
       [ 6,  8, 11, 15]])

实现

1.最直观的是直接循环遍历每一个元素,判断是否等于给定的整数,如果相等则输出存在,否则不存在

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
# array 二维列表
def Find(self, target, array):
for i in range(len(array)):# row = len(array) #列表的长度(有多少个元素,这里元素也是列表),可以看作是二维数组的行数
for j in range(len(array[0])):#col = len(array[0])#列表第0个元素的长度,可以看作是二维数组的列数
if array[i][j] == target:
return True
return False

method = Solution()
answer = method.Find(70,array)
answer

2.由于数组元素是分别按行按列递增的,考虑:将目标值与较大的元素进行比较,通过排除较大值向下遍历

最后一行第一列开始遍历,记给定的整数为target,数组元素为array[i][j]
如果 target < array[i][j] 则行数减1
如果 target > array[i][j] 则列数加1
如果 target == array[i][j] 则返还True

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
# array 二维列表
def Find(self, target, array):
fond = 0
row = len(array) - 1
col = len(array[0]) - 1
i = row
j = 0
while i >= 0 and j <= col:

if target < array[i][j]:
i = i - 1
elif target > array[i][j]:
j = j + 1
else:
return True
else:
return False
1
2
3
method = Solution()
answer=method.Find(5,array)
answer