【LeetCode笔记】二分查找法中的((right - left) >> 1) + left

博客讨论了在实现二分查找算法时如何避免整数溢出的问题。通过将 `(right + left) / 2` 改写为 `(right - left) >> 1` 加上 `left`,可以有效地防止数值溢出,同时保持代码的效率。这个优化对于大型数组的搜索插入位置问题尤其重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目35:搜索插入位置

 实现代码如下,使用二分查找法完成。

int searchInsert(int* nums, int numsSize, int target) {
    int left = 0, right = numsSize - 1, ans = numsSize;
    while (left <= right) {
        int mid = ((right - left) >> 1) + left;
        if (target <= nums[mid]) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return ans;
}

值得关注的代码语句为

int mid = ((right - left) >> 1) + left;

int 型数据的取值范围,有最大值 MAX 和最小值 MIN;left 和 right 满足范围;但是 left + right 不一定小于 MAX 有可能导致数值溢出。

 所以先将上述代码改写为

int mid = ((right + left)/2;

避免数值溢出, 然后由于位运算更加快速,使用右移一位操作代替数据的除以2操作

int mid = ((right - left) >> 1) + left;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YunKaiFir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值