LeetCode 分类刷题:1901. 寻找峰值 II

题目

一个 2D 网格中的 峰值 是指那些 严格大于其相邻格子(上、下、左、右)的元素。

给你一个从 0 开始编号 的 m x n 矩阵 mat ,其中任意两个相邻格子的值都不相同 。找出 任意一个 峰值 mat[i][j] 并 返回其位置 [i,j] 。

你可以假设整个矩阵周边环绕着一圈值为 -1 的格子。

要求必须写出时间复杂度为 O(m log(n)) 或 O(n log(m)) 的算法

解析

利用行最大值判断峰顶位置

我们可以二分包含峰顶的行号 i:

  • 如果 mati 的最大值比它下面的相邻数字小,则存在一个峰顶,其行号大于 i。缩小二分范围,更新二分区间左端点 left。
  • 如果 mati 的最大值比它下面的相邻数字大,则存在一个峰顶,其行号小于或等于 i。缩小二分范围,更新二分区间右端点 right。

对于本题,如果每次二分,都是 mati 的最大值比它下面的相邻数字小,那么最后会判断出峰顶行号大于 m−2,此时可以直接确定最后一行必然包含峰顶。

这意味着 m−1 不需要在初始二分范围内 ,初始二分范围为 0,m−2。在这个范围中二分,如果每次都更新的是区间左端点 left,那么最后得到的二分结果必然是 m−1。

如果在 0,m−1 中二分,还需要额外判断 i+1 是否越界。在 0,m−2 中二分可以避免越界判断。

作者:灵茶山艾府

链接:https://leetcode.cn/problems/find-a-peak-element-ii/solutions/2571587/tu-jie-li-yong-xing-zui-da-zhi-pan-duan-r4e0n/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

答案

python 复制代码
class Solution:
    def findPeakGrid(self, mat: List[List[int]]) -> List[int]:
        left, right = -1, len(mat) - 1
        while left + 1 < right:
            i = (left + right) // 2
            mx = max(mat[i])
            if mx > mat[i + 1][mat[i].index(mx)]:
                right = i  # 峰顶行号 <= i
            else:
                left = i  # 峰顶行号 > i
        return [right, mat[right].index(max(mat[right]))]

# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/find-a-peak-element-ii/solutions/2571587/tu-jie-li-yong-xing-zui-da-zhi-pan-duan-r4e0n/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度分析

时间复杂度:O(nlogm),其中 m 和 n 分别为 mat 的行数和列数。需要二分 O(logm) 次,每次二分需要 O(n) 的时间寻找 mati 最大值的下标。

空间复杂度:O(1)。仅用到若干额外变量。

作者:灵茶山艾府

链接:https://leetcode.cn/problems/find-a-peak-element-ii/solutions/2571587/tu-jie-li-yong-xing-zui-da-zhi-pan-duan-r4e0n/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
特立独行的猫A2 小时前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python
陆陆陆六3 小时前
# 五个AI引擎的答案采集:反爬、去重与时间窗对齐的三个工程细节
python·net·ai答案采集
闻缺陷则喜何志丹3 小时前
【C++特性】四种类型转
c++·算法·类型转换
喵本喵叁肆3 小时前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
青梅味猪大肠4 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
小小张说故事5 小时前
Python 的 a[1:5:2] 到底切出了什么?拆开 slice 对象、__getitem__ 与负步长那次反向
python
wuyk5555 小时前
PyQt6-第15讲-数据可视化QChart
python·ui·信息可视化·pyqt
天天被压力6 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
日日大王学编程6 小时前
2026主流AI Agent产品分类、核心差异与技术特性全解析
人工智能·后端·python
天天被压力6 小时前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python