There is an integer matrix which has the following features:
- The numbers in adjacent positions are different.
- The matrix has n rows and m columns.
- For all i < m, A[0][i] < A[1][i] && A[n - 2][i] > A[n - 1][i].
- For all j < n, A[j][0] < A[j][1] && A[j][m - 2] > A[j][m - 1].
We define a position P is a peek if:
A[j][i] > A[j+1][i] && A[j][i] > A[j-1][i] && A[j][i] > A[j][i+1] && A[j][i] > A[j][i-1]
Find a peak element in this matrix. Return the index of the peak.
public class Solution {
/*
* @param A: An integer matrix
* @return: The index of the peak
*/
public List<Integer> findPeakII(int[][] A) {
// write your code here
List<Integer> list = new ArrayList<>();
if (A == null || A.length == 0 || A[0] == null || A[0].length == 0) {
return list;
}
int start = 0, end = A.length - 1, mid = 0;
while (start <= end) {
mid = (start + end) / 2;
int col = find(mid, A);
if (A[mid - 1][col] > A[mid][col]) {
end = mid;
} else if (A[mid + 1][col] > A[mid][col]) {
start = mid;
} else {
list.add(mid);
list.add(col);
break;
}
}
return list;
}
private int find(int mid, int[][] A) {
int max = Integer.MIN_VALUE;
int col = 0;
for (int i = 0; i < A[mid].length; i++) {
if (A[mid][i] > max) {
max = A[mid][i];
col = i;
}
}
return col;
}
}