阅读目录
- 题目描述
- 思路过程
- Python实现
题目描述
'''
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,
判断数组中是否含有该整数。
'''
思路过程
'''
首先对二维数组要有一定的了解,Python中类似数组的数据结构是列表(list),
列表相对于数组来说,可以扩展(增加)和压缩(删减);
对于一个二维数组 array,通常表示为:array=[i][j] 前者是每一行,后者是每一列,
通过行和列,可以确定二维数组中的一个值。
'''
'''
回归题意:因为每一行最后一个数,是该行最大的;每一列最后一个数是也是最大的,
所以上图中:7应该是最大的数,相对于第一行最后一个4,是这一行最大的,但是4对应在列是最小的;
所以我们集中来研究“4”这个值 arrar[0][3] :
当要找的值 如果 >4 那肯定不是在同一行
如果 <4 那肯定不是在同一列
那么我可以,通过判断来分别决定移动行和列
'''
Python实现
直接遍历法,时间复杂度O(n)=n*m 即是 O(n)=n^2
def Find(self, target, array): # 行 / 横
for i in range(len(array)):
for j in range(len(array[i])): # 列 / 竖
if target==array[i][j]: # 两个位置来确定一个数
return True
return False
优化后,时间复杂度O(n)=n
def find_num(target, array):
if len(array) == 0:
return False
row_count = len(array) # 行数
column_count = len(array[0]) # 列数
i = 0 # 行 假设是第一行
j = len(array[0]) - 1 # 第一行对应的列,下标是从0开始的
value = array[i][j] # 选定的一个值
while i < row_count and j >= 0: # 确定循环边界
if target == value:
return True
elif target > value: # 肯定在下一行
i += 1
else:
j -= 1 # 肯定在前一列
return False
array = [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
print(find_num(3, array))
class Solution:
def Find(self, target, array):
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