/*两分法查找插入位置*/ public class Solution { public int searchInsert(int[] nums, int target){ int len = nums.length; //这里排除数组为空的特殊情况; if (len == 0){ return 0; } //另外排除一个整个数组都小于插入目标的情况,直接插在最后一位即可 if (nums[len-1]<target){ return len -1; } /*主代码部分,left和right是初始变量,直接在循环外赋值,while条件就要用上, 得先规定好*/ int left = 0; int right = len-1; while(left<right){ //mid在循环内要反复使用,每次判断完left<right都要重新产生一个mid //所以mid要定义在while内 int mid = left + (right-left)/2; if(nums[mid]<target){ left = mid +1; }else{ right = mid; } } return left; /*由于我们只是需要直到插入的位置,所以只需要返回最后指针的位置 当while执行完,多次变动之后的left和right其实已经逐渐从两头夹向了 中间,确定了一个坐标,这个坐标,左侧的数小于目标,右侧的数大于 目标,其实这个坐标就是严格大于target的第一个数,它的下标,为了找到这个 严格大于target的第一个数,我们的方法是,当左指针不再小于target,从左到右 跳动的左指针处,就是我们要插入的位置;右指针的目的,是帮我们大规模缩小右侧 边界,每次当中指针都大于目标的时候,直接把中指针右边全部内容都砍掉;即便 此时这个mid所指的位置就是我们即将插入的位置,我们也可以让if条件继续执行,直到 帮我们把左边所有比它小的位置都排除掉,那么排除完,最后left指针就会停在 left=right处,就是我们刚刚发现的那个位置,它大于target,且是从数组最左边 开始,唯一一个大于target的位置,返回它即可,由于此时while循环停在left=right, 所以其实返回left or right都行*/ } }