class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()<=0) return -1;
int index=0;
while(index<nums.size()-1){
if(nums[index+1]<nums[index]) break;
index++;
}
if(index<nums.size()-1){
if(nums[index]>target){
if(nums[0]>target) return binary_search(nums,target,index+1,nums.size()-1);
else return binary_search(nums,target,0,index-1);
}else if(nums[index]==target) return index;
else return -1;
}else return binary_search(nums,target,0,nums.size()-1);
}
int binary_search(vector<int>& nums, int target,int begin,int end){
if(begin>end) return -1;
else if(begin==end && nums[begin]==target) return begin;
else{
int mid = (begin+end)/2;
if(nums[mid]<target) return binary_search(nums,target,mid+1,end);
else if(nums[mid]==target) return mid;//出错(2)忘记了
else
return binary_search(nums,target,begin,mid-1);
}
}
};
乍一看题,要求复杂度logn,不敢动了,查找旋转位置,其实不用耗费O(n)的时间复杂度,所以先寻找旋转位置,如果没找到,说明就是有序的数组,直接调用二分查找就完了,如果找到,进行比较,如果当前索引的数字比目标大,那么在前面和后面都有可能,所以先跟第0个元素比,如果第0个元素比target大,那么就在后半部分有序的找,如果等于,那么直接返回index,如果小于,那么说明不存在,返回-1;
(1)出错位置,二分查找的时候,少了一个等于判断。