题目描述:
解法:二分法
排序数组旋转后依然可以使用二分法。使用二分法可以满足O(logn)的时间复杂度。
下图:
二分法中最重要的一步, 判断nums[mid]与target的关系。
看图说话:
垂直线左边的最小的数肯定>=
垂直线右边的最大的数。
如果能够看出这个特点,此题就可以按二分法进行查找了。
if(nums[mid] >= nums[0])。垂直线左边查找。左边是完全升序的。
else {
右边进行二分查找。
}
代码:
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
int rest = -1;
int left = 0, right = len - 1;
int b = nums[right];
while(left <= right){
int mid = (left + right) >> 1;
if(nums[mid] == target){
return mid;
}
if(nums[mid] >= nums[0]){
if(target >= nums[0] && target < nums[mid]){
right = mid - 1;
} else {
left = mid + 1;
}
} else {
if(target > nums[mid] && target <= nums[right]){
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return rest;
}
}