注意题目最后一行:You must write an algorithm that runs in O(m log(n)) or O(n log(m)) time.
基本确定要考察binary search.首先设置函数,找到每一行最大的数字所在的列,然后二分出一个行数来,基于这个行和其对应最大值的列。与其下一行的相同列做对比,下一行大,则缩小行的下限,反之则缩小上限right。
class Solution:
def findPeakGrid(self, mat: List[List[int]]) -> List[int]:
m = len(mat)
n = len(mat[0])
def max_col_in_a_row(mat, row):
res = 0
curmax = float('-inf')
for i in range(n):
if mat[row][i] > curmax:
curmax = mat[row][i]
res = i
return res
left = 0
right = m - 1
while left < right:
mid = left + (right - left)//2
col = max_col_in_a_row(mat, mid)
if mat[mid][col] < mat[mid+1][col]:
left = mid + 1
else:
right = mid
return [left, col]
如果不考虑题目最后一行的要求,补齐mat后暴力就行。
class Solution:
def findPeakGrid(self, mat: List[List[int]]) -> List[int]:
m = len(mat)
n = len(mat[0])
tail = head = [-1 for _ in range(2+n)]
newmat = [head]
for row in mat:
newrow = [-1] + row + [-1]
newmat.append(newrow)
newmat.append(tail)
dirt = [(0,1),(1,0),(-1,0),(0,-1)]
for i in range(1,m+1):
for j in range(1,n+1):
can = []
for dx,dy in dirt:
newx = i + dx
newy = j + dy
can.append(newmat[newx][newy])
#print(can)
if newmat[i][j] > max(can):
return [i-1,j-1]