从今天开始希望能记录刷题的过程。牛客和力扣中都有相关题目,这里以牛客的题目描述为主。该系列默认采用python语言。
问题描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
所用数据结构:数组
题解:
方法一:暴力法
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
#时间复杂度O(mn)->O(n ^ 2)
for i in range(len(array)):#行
for j in range(len(array[i])):#列
if target == array[i][j]:#若找到,返回True
return True
return False
复杂度分析:时间复杂度O(n^2)
方法二:双指针法
维护两个指针,小指针i(表示行号)和大指针j(表示列号),(趋势是从右上到左下)并不断缩小所查找的范围。
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
#时间复杂度O(m + n)-> O(n)
row_count = len(array)
if row_count == 0 or len(array[0]) == 0:
return False
col_count = len(array[0])
i = 0
j = col_count -1
while i < row_count and j >= 0:
value = array[i][j]
if target == value:#如果找到,返回
return True
elif target < value:#如果目标较小,则把大指针j减小,在小于j的列号里查找
j -= 1
else: #如果目标较大,则把小指针i增大,在大于i的行里查找
i += 1
return False
复杂度分析:时间复杂度O(n)