35 搜索插入位置

在这里插入图片描述
解题思路:
\qquad 时间复杂度要求为O(Log N),可知此题用二分查找解决。
\qquad 二分基本思路是,通过锚定一个中间值mid,把搜索区间一分为二,根据mid与目标值的比较结果,更新下一次搜索区间(左半边或右半边),直至区间大小为1。

\qquad 二分其实是有模版的,而且有两种:一种是从左向右找到第一个 ≥ \geq target 的位置(对应移动l),另一种是从右向左找到第一个 ≤ \leq target的位置(对应移动r)。
\qquad 由于本题中,有序数组中无重复元素,且如果没找到此元素时,返回要插入的位置,可以使用模版一来解决。

\qquad 定义区间的边界lr初始化为[0, N-1]。要找第一个 ≥ t a r g e t \geq target target 的位置,即该位置左边的所有元素均小于target。因此当nums[mid] < target时,更新l = mid+1,否则即nums[mid] >= target时,r = mid。最后的退出条件是l == r,通过不断移动l来保证r是第一个大于或等于target的元素。

\qquad 有一点需要注意:由于lr的取值范围都在[0, N-1]内,题目存在一中特殊情况,即所有元素小于target时,返回nums.size()需要特殊处理下。

	int searchInsert(vector<int>& nums, int target) {
        int l = 0, r = nums.size()-1, mid = 0;
        if(nums[nums.size()-1] < target) return nums.size();

        while(l < r)
        {
           mid = (l + r) / 2;
           if(nums[mid] < target)
           {
                l = mid + 1;
           }
           else
           {
                r = mid;
           }
        }
        return l;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值