从题目可知数组是部分有序的,因此可以使用二分查找来缩短查找时间。由于数组被旋转了一次,因此被分为了前后两部分,其中每一部分内部都是升序的,因此可以用两段式的二分查找的做,即先进行一次判断,nums[mid] 是属于前半部分还是后半部分,然后再根据大小关系进行二分查找。
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
int mid = (left+right)/2;
while(left<=right){
mid = (left+right)/2;
if(nums[mid] == target){
return mid;
}
if(nums[mid] >= nums[left]){
//left ~ mid 处数组递增
if(target<nums[mid] && target >= nums[left]){
right = mid-1;
}else{
left = mid+1;
}
}else{
// mid~ right 处数组递增
if(target>nums[mid] && target <= nums[right]){
left = mid+1;
}else{
right = mid-1;
}
}
}
return -1;
}
}