剑指 Offer 04. 二维数组中的查找
Posted 炫云云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 04. 二维数组中的查找相关的知识,希望对你有一定的参考价值。
剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
[
[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。
限制:
0 <= n <= 1000
0 <= m <= 1000
类似于二分查找, 数组中元素与目标值比较,如果该元素小于目标值,那么目标值在该元素的下方或右方,如果大于目标值,那么目标值在该元素的上方或者左方。
对于二分查找来说,每次比较只能移动一个指针,在二维数组的查找中,两个指针是一个上下方向移动,一个是左右方向移动。两个指针可以从同一个角出发。 假设我们从左上角出发,也就是row=0 和 col=0,如果元素小于目标数值,将row往下移或着col往右移,这样,被忽略的区域可能会是目标元素所在的区域。比如row+=1,那么第一行除左上角以外的元素就被忽略了,如果col+=1,那么第一列出左上角以外的元素就被忽略了。
思路:从左下角开始比较,左下角是最大行最小列,目标值比左下角值大,列号+1,目标值比左下角值小,行号-1
class Solution(object):
def findNumberIn2DArray(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if not matrix:
return False
rows, cols = len(matrix), len(matrix[0])
row, col = rows - 1, 0
while row>=0 and col <= cols-1:
if matrix[row][col] == target:
return True
#左下角值比目标值大,行号 -1
elif matrix[row][col] > target:
row -=1
#左下角值比目标值小,列号+1
else:
col += 1
return False
if __name__=="__main__":
s=Solution()
print(s.findNumberIn2DArray([
[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]
],5))
True
参考
以上是关于剑指 Offer 04. 二维数组中的查找的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点#剑指 Offer 04. 二维数组中的查找