题目形容得很形象了,其实只要从任意一点出发,沿元素变大的方向走,走到再也走不了的时候,就遇到了峰值。
如果我们当前在某行的最大值处:
* 如果同一列的下面那行比它大,也就是说往下能继续找到峰顶
* 吃果同一列的上面那行比它大,也就是说往上继续能找到峰顶
* 都不是,那么当前点就是峰顶
因此我们可以对行进行二分:
class Solution:
def findPeakGrid(self, mat: List[List[int]]) -> List[int]:
M = len(mat)
l, r = 0, M
while r - l > 1:
m = (l+r) >> 1
col = None
for j, v in enumerate(mat[m]):
if col is None or v > mat[m][col]:
col = j
if m+1 < M and mat[m+1][col] > mat[m][col]:
l = m+1
elif m-1 >= 0 and mat[m-1][col] > mat[m][col]:
r = m
else:
return [m, col]
col = None
for j, v in enumerate(mat[l]):
if col is None or v > mat[l][col]:
col = j
return [l, col]