LeetCode每日一题Day17||二分
- IT业界
- 2025-07-21 19:11:04

1901. 寻找峰值 II
一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。
给你一个 从 0 开始编号 的 m x n 矩阵 mat ,其中任意两个相邻格子的值都 不相同 。找出 任意一个 峰值 mat[i][j] 并 返回其位置 [i,j] 。
你可以假设整个矩阵周边环绕着一圈值为 -1 的格子。
要求必须写出时间复杂度为 O(m log(n)) 或 O(n log(m)) 的算法
示例 1:
输入: mat = [[1,4],[3,2]] 输出: [0,1] 解释: 3 和 4 都是峰值,所以[1,0]和[0,1]都是可接受的答案。
示例 2:
输入: mat = [[10,20,15],[21,30,14],[7,16,32]] 输出: [1,1] 解释: 30 和 32 都是峰值,所以[1,1]和[2,2]都是可接受的答案。
提示:
m == mat.lengthn == mat[i].length1 <= m, n <= 5001 <= mat[i][j] <= 105任意两个相邻元素均不相等.先给出代码:
class Solution { public: std::vector<int> findPeakGrid(std::vector<std::vector<int>>& mat) { int m = mat.size(); int n = mat[0].size(); int left = 0, right = n - 1; while (left < right) { int mid = left + (right - left) / 2; int maxRow = 0; for (int i = 0; i < m; ++i) { if (mat[i][mid] > mat[maxRow][mid]) { maxRow = i; } } if (mat[maxRow][mid] < mat[maxRow][mid + 1]) { left = mid + 1; } else { right = mid; } } int peakRow = 0; for (int i = 0; i < m; ++i) { if (mat[i][left] > mat[peakRow][left]) { peakRow = i; } } return {peakRow, left}; } };二分找峰值,先找到当前列最大所在行,然后比较该行和相邻列的值,确定二分方向之后峰值就好找了。
LeetCode每日一题Day17||二分由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“LeetCode每日一题Day17||二分”