提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
二分查找还需要再练习
一、题目
搜索二维矩阵
编写一个高效的算法来判断 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
-104 <= matrix[i][j], target <= 104
二、思路
看到有序序列的查找问题首先想到二分查找
首先以每一行的第一列为一组,查找目标值是哪一行的,因为条件是 while(first<=last):
,因此最后的结果出循环后一定是last=first-1
当排除掉比第一个还小或比最后一个还大的情况,last所指向的就是目标行的index。最后在行内再进行一次二分查找即可
时间复杂度O(logn)
空间复杂度O(1)
三、代码
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
#二维的一个二分查找,
#首先,每次查找第一列+最后一个值(即判断哪一行)直到两个指针指向同一行
first,last = 0,len(matrix)-1
while(first<=last):
mid=(first+last)//2
if(matrix[mid][0] == target):
return True
elif(matrix[mid][0] > target):
last=mid-1
else:
first=mid+1
#print(first,last)
if(last<0 or first>len(matrix)-1 and target>matrix[-1][-1]): #比第一个还小或比最后一个还大
return False
i=last #在last行继续二分查找
first,last=0,len(matrix[0])-1
while(first<=last):
mid=(first+last)//2
if(matrix[i][mid]==target):
return True
elif(matrix[i][mid]>target):
last=mid-1
else:
first=mid+1
return False