LeetCode Easy|【35. 搜索插入位置】

个人认为,这一题不会就是压根就没有明白二分查找,本人就是。。。。。

力扣题目链接
代码随想录思路
状态:第一次做的时候瞎调了半天,后来沉下心来之后写了这样一段代码…

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size();

        int middle = 0;
        while (left < right) {
            middle = left + (right - left) / 2;
            if (nums[middle] > target) {
                right = middle;
                if (left >= right) return middle;
            } else if (nums[middle] < target) {
                left = middle + 1;
                if (left >= right) return middle + 1;
            } else {
                return middle;
            }
        }
        return 0;
    }
};

哈哈哈看着都想笑,虽然过了但是丑陋至极。其实还是没有搞清楚二分法的精髓。

我们在使用二分法的时候,如果你用的是左闭右开,也就是你一定会写这样一段代码:

right = middle;

也就是说,如果最终在数组中没找到 target 所处的位置的话,那么就应该使得 left 在不断得靠近 right ,最后也就是三位一体,也就是说至少可以保证, left 会最终指向应该插入 target 的位置。

为了更好地理解这种左闭右开的区间,记住这几点:

  1. 初始化时,left 指向数组的第一个元素,而 right 指向数组的长度(即 nums.size()),所以区间是 [left, right)。
  2. 在循环中,我们根据 nums[middle] 和 target 的比较结果来调整 left 和 right,使得区间逐渐缩小:
    • 如果 nums[middle] < target,说明目标值在右半部分,于是我们让 left = middle + 1,排除掉 middle 这个位置。
    • 否则,目标值在左半部分或等于 middle 这个位置,于是我们让 right = middle,保持区间左闭右开。
  3. 最终,当 left 和 right 重合时,即 left == right,循环结束。此时,left 就是 target 应该插入的位置。
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值