思路1——直接遍历
缺点:访问太多次mountainArr.get()被视为错误答案
代码1
class Solution {
public:
int findInMountainArray(int target, MountainArray &mountainArr) {
for(int i=0;i<mountainArr.length();i++)
if(mountainArr.get(i)==target)
return i;
return -1;
}
};
思路2——二分查找
- 二分法查找peak
- 二分法在左区域查找target
- 二分法在右区域查找target
注意!!!
查找peak 循环没有等号
查找target 循环有等号
代码2
class Solution
{
public:
int binary_search(MountainArray & mountainArr, int target, int L, int R, int sign){
while (L <= R){
int mid = (L + R) /2 ;
int cur = mountainArr.get(mid);
if (cur == target)
return mid;
else if (cur < target||(sign&&cur>target))
L = mid + 1;
else
R = mid - 1;
}
return -1;
}
int findInMountainArray(int target, MountainArray &mountainArr)
{
//二分法查找peak
int L = 0,R = mountainArr.length() - 1;
while (L < R){
int mid = (L + R) >> 1;
if (mountainArr.get(mid) < mountainArr.get(mid + 1))
L = mid + 1;
else
R = mid;
}
int peak_idx = L;
//左边二分法查找target
int ans = binary_search(mountainArr, target, 0, peak_idx, 0 );
if (ans != -1)
return ans;
//右边二分法查找target
return binary_search(mountainArr, target, peak_idx + 1, mountainArr.length()- 1, 1 );
}
};