这是 LeetCode 上的 74.搜索二维矩阵,
难度为 【中等】
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-10^4 <= matrix[i][j], target <= 10^4
分析题目要求
两种解法,一种暴力解法,直接逐个判断是否与target相等,相等则直接返回True,AC 24 ms
因为矩阵从左到右递增,每行的第一个整数大于前一行的最后一个整数,所以可以先找到target属于哪一行
for i in range(行):
if target==matrix[i][-1]:
return True
elif target<matrix[i][-1]:
break
逐行与最后一个数字进行比较,如果小于最后一个数字,则target可能就会在这此行,有二维转换为一维的
然后再用二分查找法在那行里面查找target
left,right=0,len(matrix[0])-1
nums=matrix[i]#target的可能存在的行,
while left<=right:
mid=(left+right)//2
if nums[mid]==target: return True
if nums[mid]>target:
right=mid-1:
else:
left=mid+1
代码实现
class Solution(object):
def searchMatrix(self, matrix, target):
hang=len(matrix)
lie=len(matrix[0])
for i in range(hang):
if matrix[i][-1]==target:
return True
elif target<matrix[i][-1]:#找到第一个小于的行
break
left,right=0,lie-1
nums=matrix[i]
# print(nums)
while left<=right:
mid=(left+right)//2
if nums[mid]==target:
return True
if nums[mid]<target:
left=mid+1
else:
right=mid-1
return False