/** * // This is MountainArray's API interface. * // You should not implement it, or speculate about its implementation * interface MountainArray { * public int get(int index) {} * public int length() {} * } */ classSolution{ publicintfindInMountainArray(int target, MountainArray mountainArr){ int len = mountainArr.length(); int peekIndex = findPeekIndex(mountainArr, 0, len-1); if(mountainArr.get(peekIndex) == target){ return peekIndex; }
int res = findSortedArray(target, mountainArr, 0, peekIndex - 1); if(res != -1){ return res; }
return findReverseArray(target, mountainArr, peekIndex + 1, len - 1); }
privateintfindPeekIndex(MountainArray mountainArr, int left, int right){ while(left < right){ int mid = left + (right - left) / 2; if(mountainArr.get(mid) < mountainArr.get(mid + 1)){ //下一轮搜索区间[mid+1, right] left = mid + 1; }else{ //下一轮搜索区间[left, mid] right = mid; } } // left == right return left; }
privateintfindSortedArray(int target, MountainArray mountainArr, int left, int right){ while(left < right){ int mid = left + (right - left) / 2; if(mountainArr.get(mid) < target){ //下一轮搜索区间[mid+1, right] left = mid + 1; }else{ //下一轮搜索区间[left, mid] right = mid; } } if(mountainArr.get(left) == target){ return left; } return -1; }
privateintfindReverseArray(int target, MountainArray mountainArr, int left, int right){ while(left < right){ int mid = left + (right - left + 1) / 2; if(mountainArr.get(mid) < target){ //下一轮搜索区间[left, mid - 1] right = mid - 1; }else{ //下一轮搜索区间[mid, right] //[left(mid), right] --> [left, right(mid)] 将下取整改为上取整 left = mid; } } if(mountainArr.get(left) == target){ return left; } return -1; }