-
题目:
我们把符合下列属性的数组 A 称作山脉:A.length >= 3
存在 0 < i < A.length - 1 使得A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1]
给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1] 的 i 的值。
示例 1:
输入:[0,1,0]
输出:1
示例 2:
输入:[0,2,1,0]
输出:1
- 方法一:
双指针法
代码实现:
int peakIndexInMountainArray(vector<int>& A) {
int j = A.size() - 1;
int i = 0;
while(i < j){
if(A[i] <= A[j])
i++;
else
j--;
}
return i;
}
32ms
- 方法二:
根据序列的特点
int peakIndexInMountainArray(vector<int>& A) {
int n = A.size();
for(int i = 0; i < n-1; i++){
if(A[i] > A[i+1])
return i;
}
return n-1;
}
20ms
- 方法三(最优解) 二分法
int peakIndexInMountainArray(vector<int>& A) {
int low = 1, high = A.size() - 2;
while (low <= high) {
int mid = low + ((high - low) >> 1); //求中位数
if (A[mid] > A[mid + 1]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return low;
}