题目:
这道题的难点在于有一个旋转,并且规定我们时间复杂度是O(log n),这其实就是暗示我们用二分查找法做
代码如下:
class Solution {
public int search(int[] nums, int target) {
int start=0;
int end=nums.length-1;
int mid=0;
//排除特殊情况
if(end<0) return -1;
if(end==0 && nums[0]==target) return 0;
else if(end==0 && nums[0]!=target) return -1;
//寻找翻转点
for(int i=1;i<nums.length;i++){
if(nums[i]<nums[i-1])
mid=i-1;
}
//判断target所在范围
if(target>=nums[start] && target<=nums[mid]){
end=mid;
}else if(target>=nums[mid+1] && target<=nums[end]){
start=mid;
}else return -1;
while(start <= end){
if(nums[mid] == target){
return mid;
}
if(nums[start] <= nums[mid]){ //左边升序
if(target >= nums[start] && target <= nums[mid]){//在左边范围内
end = mid-1;
}else{//只能从右边找
start = mid+1;
}
}else{ //右边升序
if(target >= nums[mid] && target <= nums[end]){//在右边范围内
start = mid +1;
}else{//只能从左边找
end = mid-1;
}
}
mid = start + (end-start)/2;
}
return -1;
}
}
结果如下: