
Input: mat =[[1,4],[3,2]]Output: [0,1]Explanation: Both 3 and 4 are peak elements so [1,0] and [0,1] are both acceptable answers.
****
Input: mat =[[10,20,15],[21,30,14],[7,16,32]]Output: [1,1]Explanation: Both 30 and 32 are peak elements so [1,1] and [2,2] are both acceptable answers.
Since each cell is only compared to its four neighbors and the matrix is surrounded by -1, a peak must exist. We can use binary search on columns: for each middle column, find the row with the maximum value, and check if it’s a peak. If not, move to the side with the greater neighbor. This gives O(m log n) time.
classSolution {
public: vector<int> findPeakGrid(vector<vector<int>>& mat) {
int m = mat.size(), n = mat[0].size();
int l =0, r = n -1;
while (l <= r) {
int mid = (l + r) /2;
int max_row =0;
for (int i =1; i < m; ++i) {
if (mat[i][mid] > mat[max_row][mid]) max_row = i;
}
int left = mid >0? mat[max_row][mid-1] :-1;
int right = mid < n-1? mat[max_row][mid+1] :-1;
if (mat[max_row][mid] > left && mat[max_row][mid] > right)
return {max_row, mid};
elseif (left > mat[max_row][mid])
r = mid -1;
else l = mid +1;
}
return {-1, -1};
}
};
classSolution {
publicint[]findPeakGrid(int[][] mat) {
int m = mat.length, n = mat[0].length;
int l = 0, r = n - 1;
while (l <= r) {
int mid = (l + r) / 2;
int maxRow = 0;
for (int i = 1; i < m; i++) {
if (mat[i][mid]> mat[maxRow][mid]) maxRow = i;
}
int left = mid > 0 ? mat[maxRow][mid-1] : -1;
int right = mid < n-1 ? mat[maxRow][mid+1] : -1;
if (mat[maxRow][mid]> left && mat[maxRow][mid]> right)
returnnewint[]{maxRow, mid};
elseif (left > mat[maxRow][mid])
r = mid - 1;
else l = mid + 1;
}
returnnewint[]{-1, -1};
}
}
classSolution {
funfindPeakGrid(mat: Array<IntArray>): IntArray {
val m = mat.size
val n = mat[0].size
var l = 0var r = n - 1while (l <= r) {
val mid = (l + r) / 2var maxRow = 0for (i in1 until m) {
if (mat[i][mid] > mat[maxRow][mid]) maxRow = i
}
val left = if (mid > 0) mat[maxRow][mid-1] else -1val right = if (mid < n-1) mat[maxRow][mid+1] else -1if (mat[maxRow][mid] > left && mat[maxRow][mid] > right)
return intArrayOf(maxRow, mid)
elseif (left > mat[maxRow][mid])
r = mid - 1else l = mid + 1 }
return intArrayOf(-1, -1)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution:
deffindPeakGrid(self, mat: list[list[int]]) -> list[int]:
m, n = len(mat), len(mat[0])
l, r =0, n -1while l <= r:
mid = (l + r) //2 max_row = max(range(m), key=lambda i: mat[i][mid])
left = mat[max_row][mid-1] if mid >0else-1 right = mat[max_row][mid+1] if mid < n-1else-1if mat[max_row][mid] > left and mat[max_row][mid] > right:
return [max_row, mid]
elif left > mat[max_row][mid]:
r = mid -1else:
l = mid +1return [-1, -1]
impl Solution {
pubfnfind_peak_grid(mat: Vec<Vec<i32>>) -> Vec<i32> {
let m = mat.len();
let n = mat[0].len();
let (mut l, mut r) = (0, n -1);
while l <= r {
let mid = (l + r) /2;
letmut max_row =0;
for i in1..m {
if mat[i][mid] > mat[max_row][mid] {
max_row = i;
}
}
let left =if mid >0 { mat[max_row][mid-1] } else { -1 };
let right =if mid < n-1 { mat[max_row][mid+1] } else { -1 };
if mat[max_row][mid] > left && mat[max_row][mid] > right {
returnvec![max_row asi32, mid asi32];
} elseif left > mat[max_row][mid] {
r = mid -1;
} else {
l = mid +1;
}
}
vec![-1, -1]
}
}