剑指offer 04.二维数组中的查找
题目描述
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
-
示例矩阵
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
给定 target =
5
,返回true
。给定 target =
20
,返回false
。
解题思路
-
暴力查找法
不考虑题目已知条件中的数组每行递增,每列递增的条件
代码如下:class Solution: def findNumberIn2DArray(self, matrix, target): # 传入数组和查找值 for row in matrix: for column in row: if column == target: return True return False
时间复杂度O(m*n),空间复杂度O(1)
-
二插搜索树
利用题目中的已知条件,从数组的最右上方开始搜索,如果目标整数大于数组最右上方的元素,则可以去掉数组的这一行:
[ [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
如果目标整数小于数组最右上方元素,则可以去掉 数组的这一列:
[ [1, 4, 7, 11], [2, 5, 8, 12], [3, 6, 9, 16], [10, 13, 14, 17], [18, 21, 23, 26] ]
因此我们可以使用递归的思想来实现这个函数:
class Solution: def findNumberIn2DArray(self, matrix, target): if not matrix: # 当数组为空时 return False self.res = False self.target = target self.helper(0, len(matrix[0])-1, matrix) return self.res def helper(self, i, j , matrix): if i < len(matrix) and j>=0: # 基线条件 if matrix[i][j] == self.target: self.res = True elif matrix[i][j] < self.target: self.helper(i+1, j, matrix) else: self.helper(i, j-1, matrix)