在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
由于这是一个二维数组,且从行的角度来看,从左到右依次增加,即同一行右边的比左边的要大;从列的角度来看从上到下依次递增,即同一列下边的值要比上边的值要大。因此,有两种思考的角度:第一,是从整个二维数组的右上角出发,找到二维数组左上角的值,要寻找的整数如果比当前的数组中的值要小,就往左移动一个位置(行);如果要找的整数比当前的数组中的值要大,那么就往下移动(列)。第二,是从数组的左下角出发,大了往左,小了往右。
下面,从右上角的角度来编写代码。
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
nrow = len(array) # 直接用len求二位数组的维度,返回的是这个数组有多少行。
ncol = len(array[0]) # 如果想要求列的话,可以求数组中某一个行向量的维度。
r = nrow - 1 # 由于Python中的维度是从零开始,因此,要在原来的维度上减去1
c = ncol - 1 # 同上
# 这里设置r,c变量是为了限制循环条件的时候方便
flag = False # 设置标志变量,默认false
# 由于是从右上角出发,因此第一个位置的维度是array[0][ncol-1]
i = 0
j = ncol -1
while i <= r and j >= 0: # 循环终止的条件,行、列越界。
if array[i[[j] == target: # 如果当前的值等于要找的目标值,那么就修改flag为True,并终止循环
flag = True
break
if array[i[[j] > target: # 如果当前的值大于target,即target如果存在的话应该,应该在当前值的左边。
j -= 1
if array[i[[j] < target: # 如果当前的值小于target,即target如果存在的话应该,应该在当前值的下边。
i += 1
return flag