题意:
将一个升序数组,从中切断,将切断点后面的序列拼接到前面。注:切断点也可能在最后一个数字之后,即数组保持升序不变。
分析:
对一个数组的顺序查找,时间是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; } }