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
* function MountainArray() {
* @param {number} index
* @return {number}
* this.get = function(index) {
* ...
* };
*
* @return {number}
* this.length = function() {
* ...
* };
* };
*/
/**
* @param {number} target
* @param {MountainArray} mountainArr
* @return {number}
*/
var findInMountainArray = function(target, mountainArr) {
let peak = getPeak(target, mountainArr);
let left = searchLeft(target, mountainArr, peak);
let right = searchRight(target, mountainArr, peak);
if(left === -1) return right;
else return left;
};
function getPeak(tar, arr){
let low = 0;
let high = arr.length()-1;
while(low <= high) {
let mid = (low + high) >> 1;
let val = arr.get(mid);
let tmp = arr.get(mid+1);
if(tmp > val) low = mid+1;
if(tmp < val) high = mid-1;
}
return low;
}
function searchLeft(tar, arr, peak) {
let low = 0;
let high = peak;
while(low <= high) {
let mid = (low+high) >> 1;
let val = arr.get(mid);
if(val < tar) low = mid+1;
if(val > tar) high = mid-1;
if(val === tar) return mid;
}
return -1;
}
function searchRight(tar, arr, peak) {
let low = peak;
let high = arr.length()-1;
while(low<=high){
let mid = (low + high) >> 1;
let val = arr.get(mid);
if(val > tar) low = mid+1;
if(val < tar) high = mid-1;
if(val === tar) return mid;
}
return -1;
}