方法一:设置左下角元素为标记flag,依次消去每行每列(左下角->右上角)
时间复杂度:O(m + n)
详细请参考题解
# 题解,时间复杂度:O(m + n)
class Solution:
def findNumberIn2DArray(self, matrix, target) -> bool:
i, j = len(matrix) - 1, 0
while i >= 0 and j < len(matrix[0]):
flag = matrix[i][j]
if target > flag: # 消去当前列
j += 1
elif target < flag: # 消去当前行
i -= 1
else:
return True
return False
方法二:遍历每行,每行数组用二分查找
时间复杂度:O(nlogn)
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if not matrix or not matrix[0]:
return False
m = len(matrix[0])
for row in matrix:
if target >= row[0] and target <= row[m - 1]:
l = 0
r = m - 1
while l <= r: ## 细节! not <
mid = (l + r ) // 2
if target == row[mid]:
return True
elif target < row[mid]:
r = mid - 1
else:
l = mid + 1
return False