二分查找-有序数组出现的第一个下标和最后一个下标
这是在面试的时候写的一道题,不过当时由于把递归函数recurse里面的 <target_loc= =-1> 写成了 <target= =-1> 导致出现断错误,面完后一下子就找到bug,哎,可惜了
#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include <string>
#include <math.h>
#include <cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
// To execute C++, please define "int main()"
// The TestCase is shown below
// Input : 1 2
// Output : 3
//[1,2,2,2,2,3,3,4,4,5,5,6,6,7,7,8]
int func(vector<int> arr,
const int target,
int left,int right){
while(left<right){
int mid = (left+right)/2;
if(arr[mid]==target)
return mid;
else if(arr[mid]<target)
left = mid+1;
else
right = mid-1;
}
return -1;
}
void recurse(vector<int> arr, int target,int left, int right,vector<int> &res){
if(left<right){
int target_loc = func(arr,target,left,right);
if(target_loc==-1)
return;
res.push_back(target_loc);
recurse(arr,target,left,target_loc-1,res);
recurse(arr,target,target_loc+1,right,res);
}
}
int main(){
vector<int> arr={1,2,2,2,2,3,3,4,4,5,5,6,6,7,7,8};
vector<int> res;
recurse(arr,2,0,arr.size()-1,res);
cout<<res[res.size()-2]<<" "<<res[res.size()-1]<<endl;
return 0;
}