Medium
思路
- logn的时间复杂度,就要用binary search
- 二分法找到array里最小的那个值得的点就是我们要找的pivot point
- 在二分法找target
过程
- 第一次二分法
- mid = l + ( r - l ) / 2
- 如果 num[mid] > num[r], 说明不正常,因为正常的sorted array应该是左边小右边大,说明pivot point(最小值)在mid的右侧。缩小范围,将l右移,l=mid + 1;
- 如果num[mid] <= num[r], 说明正常,最小值还在mid的左侧(包含mid),于是将r左移,r = mid;
- 第一次结束,l值为所求的pivot
- 根据target的值判断在哪一侧执行二分法找target
代码
class Solution {
public int search(int[] nums, int target) {
if(nums.length == 0) return -1;
int l = 0, r = nums.length - 1;
while(l < r){
int mid = l + (r - l) / 2;
if(nums[mid] > nums[r]){
l = mid + 1;
}else{
r = mid;
}
}
int s = l;
l = 0;
r = nums.length - 1;
if(target >= nums[s] && target <= nums[r]){
l = s;
r = nums.length - 1;
}else{
l = 0;
r = s - 1;
}
while(l <= r){
int mid = l + (r - l)/2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target){
l = mid + 1;
}else{
r = mid - 1;
}
}
return -1;
}
}