题目:
编写一个高效的算法来搜索 m x n 矩阵中的一个目标值。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
例如,
考虑下面的矩阵:
[ [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
。
分析:
- 首先通过二分法,对比每行尾部元素与目标元素,排除目标元素不可能存在的行,时间复杂度O(lgn);
- 遍历目标元素可能存在的行,使用二分法,在各行中寻找目标元素,直到下一行的头部元素大于目标值或找到目标值,则终止
代码:
class Solution(object):
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if (not matrix) or (not matrix[0]):
return False
if matrix[0][0] > target or matrix[-1][-1] < target:
return False
len0 = len(matrix)
len1 = len(matrix[0])
l = 0
r = len0 - 1
j = -1
while l < r:
mid = (l + r) // 2
# print mid
if matrix[mid][-1] == target:
return True
if matrix[mid][-1] > target:
r = mid - 1
# if matrix[r][-1] < target:
# j = mid
# break
if matrix[mid][-1] < target:
l = mid + 1
if matrix[l][-1] > target:
j = l
break
if j == -1:
j = l
print "j:%d"%j
for x in matrix[j:]:
if x[0] > target:
return False
l = 0
r = len1 - 1
while l < r:
mid = (l + r) // 2
if x[mid] == target:
return True
if x[mid] > target:
r = mid - 1
if x[mid] < target:
l = mid + 1
if x[l] == target:
return True
return False
思考:
- 需要特殊处理的情况矩阵为[]、[[]]