题目描述(中等)
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 输出: true
示例 2:
输入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 输出: false
思路分析
明显此题使用二分查找法。
我自己的直接想法是:利用二分查找,先求出target所在的行,然后在求出所在的列。找到返回True,否则返回False。如代码1
网上看别人写的代码看起来比较简单,但都是二分法,我觉得差不多。思路:直接对matrix所有元素进行二分查找。如代码2
代码
代码1:
class Solution:
def findRow(self, matrix, target):
start = 0
end = len(matrix) - 1
while start < end:
mid = (start + end) // 2
if target < matrix[mid][0]:
end = mid-1
elif target > matrix[mid][-1]:
start = mid+1
else:
return mid
return start
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if matrix==[]:
return False
Row = self.findRow(matrix, target)
n = len(matrix[0])
startC = 0
endC = n - 1
while startC < endC+1:
mid = (startC + endC) // 2
if target == matrix[Row][mid]:
return True
elif target < matrix[Row][mid]:
endC = mid-1
else:
startC = mid+1
return False
代码2:
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if matrix == []:
return False
m, n = len(matrix), len(matrix[0])
low = 0
high = m * n
while low < 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