在leetCode中刷到这个题时,刚开始不知道什么意思,在理解之后我发现只要找到数组中发生旋转的那个位置就很好做,从这个位置开始把数组分成两个部分,因为是升序数组,所以这两个部分就相当于两个升序数组,再用二分法查找就可以了。
用来旋转位置的函数
private static int midSearch(int[] nums, int l, int r) {
while(l<=r) {
int mid=(l+r)>>1;
if(mid+1<nums.length&&nums[mid]>=nums[0]&&nums[mid+1]<nums[0]) {
return mid+1;
}
if(nums[mid]>=nums[0]) {
l=mid+1;
}else {
r=mid-1;
}
}
return nums.length-1;
}
二分法查找:
private static int searchCore(int[] nums, int l, int i, int target) {
while(l<=i) {
int mid=(l+i)>>1;
if(nums[l]==target) {
return l;
}
if(nums[i]==target) {
return i;
}
if(nums[mid]==target) {
return mid;
}else if(nums[mid]<target){
l=mid+1;
}else {
i=mid-1;
}
}
return -1;
}
主函数:
public int search(int[] nums, int target) {
if(nums==null||nums.length==0){
return -1;
}else if(nums.length==1){
return nums[0]==target?0:-1;
}
int l=0,r=nums.length-1;
int a=midSearch(nums,l,r);
if(target==nums[r]) {
return r;
}
if(target>=nums[0]) {
return searchCore(nums,l,a-1,target);
}else {
return searchCore(nums,a,r,target);
}
}