题意:
给你一个无重复元素的递增数组,这个数组后来被左移或者右移了未知步数,形成新的数组,让你找到target所在位置,如果不存在则返回-1;
思路:
同样可以使用二分查找,但是要考虑多种情况。
情况首先分为两大类:
1.中间元素大于等于左边界的值,(说明从左到中间是绝对递增的。
2.中间元素小于左边界的值(说明从中间到右边是绝对递增的。
然后每种情况考虑target值的可能位置即可确定下次二分查找在哪个区间执行。
java代码:
class Solution {
public int search(int[] nums, int target) {
int r = nums.length;
if(r==0){
return -1;
}
int l = 0;
r -= 1;
while(l<=r){
int mid = (l+r)>>1;
if(target==nums[mid]){
return mid;
}
if(nums[mid]>=nums[l]){
if(target<nums[mid]&&target>=nums[l]){
r = mid-1;
}
else{
l = mid+1;
}
}
else{
if(target>nums[mid]&&target<=nums[r]){
l = mid+1;
}
else{
r = mid-1;
}
}
}
return -1;
}
}