Leetcode 1901. Find a Peak Element II [Python]

注意题目最后一行: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]
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值