当前位置: 首页 > 工具软件 > Sara > 使用案例 >

Sara学做题--「力扣」第 35 题:搜索插入位置

陆飞龙
2023-12-01
/*两分法查找插入位置*/
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都行*/
                }
            }
 类似资料: