思路:
- 利用二分查找,设\(mid = (lo+hi)/2\),如果 \(nums[hi]>nums[mid]\)说明从\(mid\) 到\(hi\)是有序的,然后判断target是否在\(mid\)和\(hi\)之间,如果在,则\(lo = mid+1\),否则\(hi = mid-1\)。另一种情况类似。复杂度为\(O(log(n))\)。
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size() == 0) return -1;
int mid,lo = 0, hi = nums.size()-1;
while(lo < hi){
mid = (lo + hi) / 2;
if(nums[mid] == target) return mid;
else if(nums[mid] < nums[hi]){
if(nums[mid] < target && nums[hi] >= target){
lo = mid+1;
}else {
hi = mid-1;
}
}else{
if(nums[mid] > target && nums[lo] <= target){
hi = mid-1;
}else {
lo = mid+1;
}
}
}
return nums[lo] == target ? lo : -1;
}
};