2.2.35.搜索插入位置

思路:

数组为不重复的数组,求找不到时插入的位置(即找第一个大于它的值)。

左闭右闭,最后一下循环是l==r,那么最后是l=mid+1先(取决于代码先后写的顺序),r=mid

找不到时有三种情况。

1、左闭右闭是r+1

        // 分别处理如下四种情况
        // 目标值在数组所有元素之前  [0, -1]
        // 目标值等于数组中某一个元素  return middle;
        // 目标值插入数组中的位置 [left, right],return  right + 1
        // 目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 return right + 1

2、左闭右开是r 

        // 分别处理如下四种情况
        // 目标值在数组所有元素之前 [0,0)
        // 目标值等于数组中某一个元素 return middle
        // 目标值插入数组中的位置 [left, right) ,return right 即可
        // 目标值在数组所有元素之后的情况 [left, right),因为是右开区间,所以 return right

储备:

代码随想录

问题重点:

最后:

左闭右开:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n=nums.size();
        int l=0,r=n;//左右指针。左闭右开
        while (l<r) {//l==r时区间无效
            int mid=l+(r-l)/2;
            if (nums[mid]==target) return mid;
            else if (nums[mid]<target) l=mid+1;
            else r=mid;//保持区间无效
        }

        return r;
    }
};

左闭右闭:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n=nums.size();
        int l=0,r=n-1;//定义左右指针。左闭右闭
        while (l<=r) {//相等时区间有效
            int mid=l+(r-l)/2;//防溢出
            if (nums[mid]==target) return mid;
            else if (nums[mid]<target) l=mid+1;
            else r=mid-1;//保持循环不变量
        }
        //找不到时有三种情况。1、最前:最后一次循环是[r-1,0==l]
        // 2、中间,有两条分支,所以有两种情况:
        //最后一次循环可能是[r-1,mid==l](target在nums[mid]左边),r在mid左边,要插在mid的位置,
        //也可能是[mid==r,l+1](target在nums[mid]右边),要插在mid右边。
        // 3、最后:最后一次循环是[n-1==r,l]
        return r+1;
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值