leetcode题目
题解
将数组一分为二,一半是有序的,另一半是无序的。
有序的区间左端点<=右端点,无序的区间左端点>右端点。
在有序区间中找target很容易,只需要比较target和两个端点即可。如果target不在有序区间中,那么它就在无序区间中。
package com.company.test1;
public class Test6 {
public static void main(String[] args) {
int[] nums={2,4,7,9,0};
int target=9;
System.out.println(binaryFind(nums, 0, nums.length - 1, target));
}
public static int binaryFind(int[] nums,int left,int right,int target){
int mid=(left+right)/2;
if(right-left+1<=4){
for (int i = left; i <=right ; i++) {
if(nums[i]==target)
return i;
}
return -1;
}
if(target==nums[mid]){
return mid;
}
/*如何判断左侧是否有序,只需要判断左端点是否<=右端点*/
if(nums[left]<=nums[mid-1]){
//[left,mid-1]有序
if(nums[left]<=target && target<=nums[mid-1]){
return binaryFind(nums,left,mid-1,target);
}else{
return binaryFind(nums,mid+1,right,target);
}
}else{
// 右边有序
if(nums[mid+1]<=target && target<=nums[right]){
return binaryFind(nums,mid+1,right,target);
}else{
return binaryFind(nums,left,mid-1,target);
}
}
}
}