由于二分越界条件很多,所以下面是本地DEV可调试版本
#include<bits/stdc++.h>
using namespace std;
int ans=-1;
void dfs(int l,int r,int target,vector<int>& nums){
int mid=l+(r-l)/2;
if(mid<0||l<0||r>=nums.size())return;
if(nums[mid]==target){
ans=mid;
return;
}
if(nums[l]==target){
ans=l;
return;
}
if(nums[r]==target){
ans=r;
return;
}
if(l>=r)return;
if(nums[mid]>nums[l]){
if(nums[l]<target&&nums[mid]>target)dfs(l,mid-1,target,nums);
else dfs(mid+1,r,target,nums);
}
else{
if(nums[r]>target&&nums[mid]<target)dfs(mid+1,r,target,nums);
else dfs(l,mid-1,target,nums);
}
}
int main(){
vector<int> nums={5,1,3};
int target=0;
int l=0,r=nums.size()-1;
dfs(l,r,target,nums);
cout<<ans;
}
在线版本
class Solution {
public:
int ans=-1;
void dfs(int l,int r,int target,vector<int>& nums){
int mid=l+(r-l)/2;
if(mid<0||l<0||r>=nums.size())return;
if(nums[mid]==target){
ans=mid;
return;
}
if(nums[l]==target){
ans=l;
return;
}
if(nums[r]==target){
ans=r;
return;
}
if(l>=r)return;
if(nums[mid]>nums[l]){
if(nums[l]<target&&nums[mid]>target)dfs(l,mid-1,target,nums);
else dfs(mid+1,r,target,nums);
}
else{
if(nums[r]>target&&nums[mid]<target)dfs(mid+1,r,target,nums);
else dfs(l,mid-1,target,nums);
}
}
int search(vector<int>& nums, int target) {
int l=0,r=nums.size()-1;
dfs(l,r,target,nums);
return ans;
}
};