没有重复元素的无序数组,找一个peak,端点也可以是peak。
基于这样一个性质:
若一个区间两头的元素比相邻的外部元素大,则必存在peak。(这个peak是包含两边外部元素的区间的peak)
算法:
若A[mid]>A[mid-1] 下一次的区间就是 [mid, end], 因为A[mid]> A[mid-1],且最右端可以想像有一个虚拟的额外元素A[end+1]是负无穷,则区间[mid,end]存在区间[mid-1, end+1]的peak。
若A[mid]>A[mid+1] 下一次的区间就是 [begin, mid]
其他形况: mid比相邻两边都小,区间取[begin, mid-1]或 [mid+1, end]都行。
出口:n<=3就可以处理了,最大值就是。(没仔细想,应该是)。
int findPeakElement(const vector<int> &num) {
int l = 0, r = num.size() - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (num[mid] > num[mid + 1]) r = mid;
else l = mid + 1;
}
return l;
}