题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
分析:给的数组是有特点的数组,行递增,列递增。
并不是一眼就能看出题眼在矩阵右上角的那个位置,但是多试几次就能知道。
右上角的数字特点:是本行的最大值,本列的最小值。即如果给定需要查找的数比它大,那么该行的数字可以排除(因为比这行最大的还要大啊);如果比他小,那么该列的数字可以排除。
这样比逐个遍历优在查找的次数会少很多。
在写函数的时候,我觉得关键点是确定循环的条件,即边界位置。
(贴士:if和elif组合,if执行了,elif就不会执行了。和if if 作区分。)
# 【优】方法二:根据二维数组的特点,从右上角开始遍历。右上角是该行最大,该列最小
# 如果比要查找的数字大,就抛弃这一列;如果比要查找的数字小,就抛弃这一行。
class Solution:
def Find(self, target, array):
row = 0 # 第0行下标
col = len(array[0])-1 # 最后一列下标。即右上角
while col>=0 and row<=len(array)-1: # 下标合法
if array[row][col]>target:
col -= 1
elif array[row][col]<target:
row += 1
elif array[row][col]==target:
return True
return False
下面把遍历的方法也贴出,感受上面方法的优势。
两个循环。
# 方法一:逐行遍历,不推荐
class Solution:
def Find(self, target, array): # array 二维列表
for i in range(len(array)): # 外循环,逐行
for j in range(len(array[0])): # 内循环,每行在逐个比较
if array[i][j] == target:
return True
return False