本周题目难度级别'Medium',使用语言'Python'
题目:给你一个数target及m*n的有序矩阵(从小到大),让你查找target是否在这个矩阵中。eg:矩阵[[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50]] & target = 3 返回True
思路:其实思路很简单,就是实现起来有点困难,再次体会到'Talk is cheap,show me the code!'的真谛。说说我的思路吧,我用了两次二分法,先将m*n的矩阵的第一列作为一个数组进行二分查找,确定target所在的行row。然后再次用二分法对row行进行查找,看是否有等于target的数。思路很简单,接下来看代码吧:
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
row = len(matrix)
#避免为空
if matrix and matrix[0]:
left = 0
right = row-1
#第一次二分查找确定行
while (right >= left):
mid = (left + right) // 2
if (target < matrix[mid][0]):
right = mid - 1
elif (target > matrix[mid][0]):
left = mid + 1
else: return True
#因为二分查找出来的其实有不够精确,可能会误差一行,故要判断找出真的一行
if (target > matrix[mid][0]):result_row = mid
else: result_row = mid-1
#重置参数第二次二分查找,即可返回结果
col = len(matrix[0])
left = 0
right = col-1
while (right >= left):
mid = (left + right) // 2
if (target < matrix[result_row][mid]):
right = mid - 1
elif (target > matrix[result_row][mid]):
left = mid + 1
else: return True
return False
else: return False
效率还是挺高的,就是感觉代码写的有点长,用到了两次二分查找,但感觉就算把公共部分提出来也省不了几行。。。