题目:搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
每行的元素从左到右升序排列。每列的元素从上到下升序排列。
示例:
现有矩阵 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。
------------------------------------------------------------------------------
解法1:每列循环 + 每行二分法,超出时限。
class Solution(object):
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
m = len(matrix)
if m == 0:
return False
n = len(matrix[0])
if n == 0:
return False
for i in range(m):
if matrix[i][0] == target or matrix[i][-1] == target:
return True
elif (matrix[i][0] > target) or (matrix[i][-1] < target):
continue
else:
if self.binarySearch(matrix[i], target):
return True
else:
continue
return False
def binarySearch(self, aList, target):
first = 0
last = len(aList)
while first < last:
midN = (last - first) // 2
if aList[midN] == target:
return True
elif (last+first) == 2:
return False
else:
if target < aList[midN]:
last = midN
else:
first = midN
return False
解法2:直接对matrix整体使用二分法。
class Solution(object):
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
m = len(matrix)
if m == 0:
return False
n = len(matrix[0])
if n == 0:
return False
low = 0
high = m * n - 1
while low+1 < high:
mid = (low + high) // 2
if matrix[mid // n][mid % n] == target:
return True
elif matrix[mid // n][mid % n] < target:
low = mid + 1
else:
high = mid
return False