int peakIndexInMountainArray(vector<int>& A) {
//二叉搜索
int i = 0, j = A.size() - 1;
auto m = 0;
while (i < j) {
m = (i + j) / 2;
if (m == 0) {
return A[i] > A[j] ? i : j;
}
if (m == A.size() - 1) {
return A[i] > A[j] ? i : j;
}
if (A[m - 1] < A[m] && A[m] < A[m + 1]) {
i = m+1;
continue;
}
if (A[m - 1]<A[m] && A[m]>A[m + 1]) {
return m;
}
if (A[m - 1] > A[m]&&A[m]>A[m+1]) {
j = m-1;
}
思路解析:在有序数组中,我们可以用二分查找的方法,来找到目标数,判断根据为头,中,尾。然后更新头尾数。
这题采用类似思路,唯一不同的地方是,我们不采用头中尾来判断更新,而是根据中的节点梯度信息来判断。分三种情况:
1、A[m-1]<A[m]<A[m+1] 顺明当前节点为有序递增节点,我们可以更新i=m+1;
2、A[m-1]>A[m]>A[m+1] 说明当前节点为有序递减节点,我们可以更新j=m-1;
3、A[m-1]<A[m]>A[m+1] 查找到目标节点,直接返回。