链接:https://leetcode-cn.com/problems/find-in-mountain-array/
/**
* * // This is the MountainArray's API interface.
* * // You should not implement it, or speculate about its implementation
* * class MountainArray {
* * public:
* * int get(int index);
* * int length();
* * };
* */
class Solution {
public:
int findInMountainArray(int target, MountainArray &mountainArr) {
int left = 0;
int right = mountainArr.length()-1;
int top = findMountainTop(mountainArr, left, right);
// 判断山顶元素是否为taget
if(mountainArr.get(top) == target) {
return top;
}
// 在山峰左边查找数字
int targetIndex= findSortMountain(mountainArr, left, top-1, target);
if(targetIndex != -1) {
return targetIndex;
}
// 在山峰右边查找数字
targetIndex= findReverseMountain(mountainArr, top+1, right, target);
return targetIndex;
}
// 找到山顶的下标
int findMountainTop(MountainArray &mountainArr, int left, int right) {
while(left <= right) {
int mid = left + (right - left)/2;
int midValue = mountainArr.get(mid);
int nextValue = mountainArr.get(mid+1);
if(nextValue > midValue) {
left = mid + 1;
} else if (nextValue < midValue) {
right = mid;
} else {
return mid+1;
}
}
return left;
}
// 标准二分模版:从小到大的数组找一个数字
int findSortMountain(MountainArray &mountainArr, int left, int right, int target) {
while(left <= right) {
int mid = left + (right - left)/2;
int midValue = mountainArr.get(mid);
if(midValue == target) {
return mid;
} else if(midValue < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
// 标准二分模版:从大到小的数组找一个数字
int findReverseMountain(MountainArray &mountainArr, int left, int right, int target) {
while(left <= right) {
int mid = left + (right - left)/2;
int midValue = mountainArr.get(mid);
if(midValue == target) {
return mid;
} else if(midValue > target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
};