Linux进程全解析:从fork到僵尸进程,一文掌握核心概念
2026/9/14 23:17:54
思路:把矩阵视为一维升序数组做二分查找(O(log(m×n)))
mid,映射回二维坐标:row = mid // n, col = mid % n。fromtypingimportListclassSolution:defsearchMatrix(self,matrix:List[List[int]],target:int)->bool:ifnotmatrixornotmatrix[0]:returnFalsem,n=len(matrix),len(matrix[0])left,right=0,m*n-1whileleft<=right:mid=(left+right)//2val=matrix[mid//n][mid%n]ifval==target:returnTrueelifval<target:left=mid+1else:right=mid-1returnFalse复杂度
另一种写法:两次二分(先定位行,再在行内二分),也是 O(log m + log n),思路更直白但代码稍长:
classSolution:defsearchMatrix(self,matrix:List[List[int]],target:int)->bool:ifnotmatrixornotmatrix[0]:returnFalsem,n=len(matrix),len(matrix[0])# 二分定位候选行:找最后一个首元素 <= target 的行lo,hi=0,m-1whilelo<hi:mid=(lo+hi+1)//2ifmatrix[mid][0]<=target:lo=midelse:hi=mid-1row=lo# 在行内二分lo,hi=0,n-1whilelo<=hi:mid=(lo+hi)//2ifmatrix[row][mid]==target:returnTrueelifmatrix[row][mid]<target:lo=mid+1else:hi=mid-1returnFalse推荐使用第一种一维二分写法,简洁且常数更小。