给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。
如果不存在这样的下标 index,就请返回 -1。
输入:array = [1,2,3,4,5,3,1], target = 3
输出:2
解释:3 在数组中出现了两次,下标分别为 2 和 5,我们返回最小的下标 2。
输入:array = [0,1,2,4,2,1], target = 3
输出:-1
解释:3 在数组中没有出现,返回 -1。
数组部分有序问题一般使用二分法:
本题思路:
1.先找最高峰
2.在高峰左边找,升序,找到结束,找不到,进入三
3.在高峰右边找
/**
* // 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() {}
* }
*/
class Solution {
public int findInMountainArray(int target, MountainArray mountainArr) {
int len = mountainArr.length();
int top = findTop(len-1,0,mountainArr);
int res = findFromSortedArr(mountainArr, 0, top, target);
if (res != -1) {
return res;
}
return findFromInversedArr(mountainArr, top, len - 1, target);
}
public int findTop(int high,int low,MountainArray mountainArr){
while(low<high){
int mid = low + (high-low)/2;
if(mountainArr.get(mid)<mountainArr.get(mid+1)){
low = mid + 1;
}else{
high = mid;
}
}
return low;
}
private int findFromSortedArr(MountainArray mountainArr, int l, int r, int target) {
// 在前有序且升序数组中找 target 所在的索引
while (l < r) {
int mid = l + (r - l) / 2;
if (mountainArr.get(mid) < target) {
l = mid + 1;
} else {
r = mid ;
}
}
if (mountainArr.get(l) == target) {
return l;
}
return -1;
}
private int findFromInversedArr(MountainArray mountainArr, int l, int r, int target) {
// 在后有序且降序数组中找 target 所在的索引
while (l < r) {
int mid = l + (r - l) / 2;
if (mountainArr.get(mid) > target) {
l = mid +1;
} else {
r = mid;
}
}
if (mountainArr.get(l) == target) {
return l;
}
return -1;
}
}