简单的二分查找
public:
int searchInsert(vector<int>& nums, int target) {
if(nums.size()==1){
if(target>nums[0]){
return 1;
}
return 0;
}
int p=0,q=nums.size()-1;
while(p+1!=q){
if(nums[(p+q)/2]==target){
return (p+q)/2;
}
else if(nums[(p+q)/2]<target){
p=(p+q)/2;
}
else{
q=(p+q)/2;
}
}
if(nums[p]>=target){
return p;
}
if(nums[q]>=target){
return p+1;
}
return q+1;
}
};
很容易想到遍历一遍,如果当前元素 arr[i] 满足 arr[i]<arr[i-1] ,那么i-1就是山顶,返回它即可
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
for(int i=1;i<arr.size();i++){
if(arr[i]<arr[i-1]){
return i-1;
}
}
return 0;
}
};
二分方法:
据题意 i 是存在的,所以肯定不在数组两端,所以双指针的初始位置为:
int p=1,q=arr.size()-2;
p是左指针,q是右指针,接下来就十分明显了
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int p=1,q=arr.size()-2;
while(p<=q){
int mid=(p+q)/2;
if(arr[mid]>arr[mid-1]){
p=mid+1;
if(arr[mid]>arr[mid+1]){
return mid;
}
}
else{
q=mid;
}
}
return 0;
}
};