题目
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
分析
1.如果nums[0]<=nums[mid],并且nums[0]<=target<nums[mid],那么target在[left,mid-1]
2.如果nums[0]<=nums[mid],但不满足nums[0]<=target<nums[mid],那么target在[mid+1,right]
3.如果nums[length-1]>=nums[mid],并且nums[mid]<target<=nums[length-1],那么target在[mid+1,right]
4.如果nums[length-1]>=nums[mid],但不满足nums[mid]<target<=nums[length-1],那么target在[left,mid-1]
代码
class Solution {
public int search(int[] nums, int target) {
int len=nums.length;
if(len==1)
return nums[0]==target?0:-1;
int left=0,right=len-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
if(nums[0]<=nums[mid]){
if(nums[0]<=target&&target<nums[mid]){
right=mid-1;
}
else{
left=mid+1;
}
}
else{
if(nums[len-1]>=target&&target>nums[mid]){
left=mid+1;
}
else{
right=mid-1;
}
}
}
return -1;
}
}
复杂度
时间复杂度: O(logn),其中 n 为nums[] 数组的大小。整个算法时间复杂度即为二分搜索的时间复杂度O(logn)。
空间复杂度: O(1) 。我们只需要常数级别的空间存放变量。