编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
如:
[
[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
思路:
可以看到,每行最左边的元素都是该行最小的,同时它的下方和右方又都比他大。
总结:矩阵左下角的元素,所有比他大的元素都在他右侧(所在列右侧),所有比他小的元素都在他上侧(所在行上侧)。
所以可以用最后一行最左边的元素作为起始索引(i,j)。
若是索引值大于target,说明target可能再索引所在行的上方,i-=1;若是索引值小于target,说明target可能在索引所在列的右方,j+=1;若是恰好是该值,则输出。
代码:
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if not matrix:
return False
rol = len(matrix)
col = len(matrix[0])
i = rol - 1 # 搞一个始终指向当下矩阵的左下角index
j = 0
judge = False
while (i >= 0) or (j < col):
if i<0 or j>(col-1):
break
if matrix[i][j] > target:
# 证明在index的上方
i = i - 1
elif matrix[i][j] < target:
# 证明在index的右方
j = j + 1
elif matrix[i][j] == target:
judge = True
break
return judge
网友评论