思路:
去中位数,不断二分。如果目标值小于等于L1说在左边直接返回 ,如果等于r1直接返回r1。如果目标值小于等于L2但是大于R1,直接返回L2。如果等于大于等于R2直接返回R2。剩下的部分看落在哪个区间,继续递归。代码如下:
class Solution {
public static int searchInsert(int[] nums, int target) {
if (nums==null||nums.length==0){
return 0;
}
int N=nums.length;
if (N==1){
return nums[0]>=target?0:1;
}
int mid=(N-1)/2;
return process(nums,target,0,mid,mid+1,N-1);
}
private static int process(int[] nums, int target, int L1, int R1, int L2, int R2) {
if (nums[L1]>=target){
return L1;
}
if (nums[R1]==target){
return R1;
}
if (nums[R1]<target&&nums[L2]>=target){
return L2;
}
if (nums[R2]==target){
return R2;
}
if (nums[R2]<target){
return R2+1;
}
//如果在左边
if (nums[L1]<target&&nums[R1]>target){
int mid=L1+(R1-L1)/2;
return process(nums,target,L1,mid,mid+1,R1);
}else {
//如果在右边
int mid=L2+(R2-L2)/2;
return process(nums,target,L2,mid,mid+1,R2);
}
}
}