题意:
将一个升序数组,从中切断,将切断点后面的序列拼接到前面。注:切断点也可能在最后一个数字之后,即数组保持升序不变。
分析:
对一个数组的顺序查找,时间是O( n ),想要比这慢,可以,二分查找是O( log n) 但是我们的二分查找是一个顺序数组,但是这是一个
*
*
*
*
*
*
*
这样的数组,可不可以二分呢?
我们来看看二分查找的本质,在于:每次能缩小一半的查找空间,从而提高效率。
那么,这个数组我们能不能判断其左右空间呢?是可以的。
分析一下就能发现,查找的点只会落在左上半段,或者右下半段两种,只要能够确定区间,就可以实现。
public class Solution {
public int search(int[] nums, int target) {
int low = 0;
int high = nums.length-1;
while(low<=high){
int mid = low + (high - low)/2;
if(nums[mid] == target)
return mid;
if(nums[mid] >= nums[low]){ //则一定在左上区间
if(target>=nums[low] && target<nums[mid]){
high = mid - 1;
}else{
low = mid + 1;
}
}else{ //则一定在右下区间
if(target>nums[mid] && target<=nums[high]){
low = mid + 1;
}else{
high = mid - 1;
}
}
}
return -1;
}
}