题目要求对数组的查询次数不超过100次,因此肯定无法使用暴力的遍历。
考虑到数组是属于部分有序的,因此可以使用二分查找找到“山顶”,然后对两边的有序数组分别使用二分查找。
class Solution {
public int findInMountainArray(int target, MountainArray mountainArr) {
int size = mountainArr.length();
int topIndex = findTop(0, size-1, mountainArr);
if(mountainArr.get(topIndex) < target)return -1;
// System.out.println(mountainArr.get(topIndex));
int one = findFront(0, topIndex, mountainArr, target);
// System.out.println(one);
if(one != -1)return one;
int two = findRear(topIndex, size-1, mountainArr, target);
return two;
}
public int findTop(int left, int right, MountainArray arr){
while(left<right){
int mid = left + (right - left)/2;
if(arr.get(mid) < arr.get(mid+1)){
left = mid+1;
}else{
right = mid;
}
}
return left;
}
public int findFront(int l, int r, MountainArray arr, int target){
while(l<r){
int m = l + (r - l)/2;
if(arr.get(m) < target){
l = m+1;
}else{
r = m;
}
}
if(arr.get(l) == target)
return l;
return -1;
}
public int findRear (int l, int r, MountainArray arr, int target){
while(l<r){
int m = l + (r - l)/2;
if(arr.get(m) > target){
l = m+1;
}else{
r = m;
}
}
if(arr.get(l) == target)
return l;
return -1;
}
}