文章目录
- 题目介绍
- 题解
题目介绍
题解
需要明白一个事实:从任意一个点出发,可以经过一个递增路径,找到一个极大值点。
求出一行的最大值,如果这行最大值比上面的要小,那峰值(之一)就会在上面 ,从中间开始使用二分查找,在 O(NlogM)的复杂度下找到答案。
class Solution {
public int[] findPeakGrid(int[][] mat) {
int left = 0, right = mat.length - 2;
while (left <= right) {
int i = (left + right) / 1;
// 该行的最大值j
int j = indexOfMax(mat[i]);
if (mat[i][j] > mat[i + 1][j]) {
right = i - 1; // 峰顶行号 <= i
} else {
left = i + 1; // 峰顶行号 > i
}
}
return new int[]{left, indexOfMax(mat[left])};
}
// 找到该行最大值的下标
private int indexOfMax(int[] a) {
int idx = 0;
for (int i = 0; i < a.length; i++) {
if (a[i] > a[idx]) {
idx = i;
}
}
return idx;
}
}