AcWing 1452. 寻找矩阵的极小值
原题链接
中等
只要看到logn级别的复杂度,几乎可以确定是二分法
O(logn) 二分 快速幂 倍增
O(nlogn) 快排 并归 堆排
O(n) 线性时间复杂度 枚举 双指针 KMP
O(n^2) 枚举 DP Dijkstra
2^n 搜索
n! 排列
class Solution(object):
def getMinimumValue(self, n):
left, right = 0, n - 1
while left < right:
mid = (left + right) // 2
k, minval = self.find_min_row(mid, n)
#找minval的左右
left_val = query(k, mid - 1) if mid > 0 else 1e15
right_val = query(k, mid + 1) if mid + 1 < n else 1e15
#二分
if minval < left_val and minval < right_val:
return k, mid
if minval > left_val:
right = mid - 1
else:
left = mid + 1
#只剩一列
k, minval = self.find_min_row(left, n)
return k, left
def find_min_row(self, col, n):
'''
找到给定列中的最小值及行号
'''
minval = 1e15
k = 0
for row in range(n):
val = query(row, col)
if val < minval:
minval = val
k = row
return k, minval