Leetcode704. 二分查找(13行 不用记while是>=还是> 和 r是mid还是mid + 1版)

题源: 704. 二分查找

思路

  1. 初始化边界:初始化l为-1和rnums.size()。我们定义 target 是在一个在左开右开的区间里,避免记混r和l应该更新为mid还是mid + 1。这样一来,r和l就都更新为mid了。

  2. 二分查找循环

    • 循环条件是l + 1 != r,意味着两个指针之间至少有一个元素。

    • 计算中点mid(l + r) / 2,这样可以避免整数溢出的风险。

    • 根据nums[mid]target的比较,更新搜索边界:

      • 如果nums[mid] > target,说明目标值在左半部分,更新r = mid

      • 如果nums[mid] < target,说明目标值在右半部分,更新l = mid

      • 如果nums[mid] == target,找到目标值,返回mid

  3. 搜索结束:如果退出循环,说明没有找到目标值,返回-1。

复杂度

时间复杂度:

  • O(log n):每次循环中点mid将搜索区间减半,因此时间复杂度为对数级别,即log2(n),其中n是数组nums的长度。

空间复杂度:

  • O(1):该算法仅使用了固定数量的额外空间(几个变量lrmid),因此空间复杂度为常量级。

特别注意:

  • 这种实现方式使用lr作为开区间的边界,使得r始终指向一个无效的超出数组的位置,而l初始为一个无效的负位置。这种方法在处理边界时更加简洁,但需要对边界条件处理得当,以避免越界或漏检错误。

代码模板:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = -1, r = nums.size();
        while(l + 1!= r){
            int mid = l + (r - l)/2;
            if(nums[mid] > target) r = mid;
            else if(nums[mid] < target) l = mid;
            else return mid;
        }
        return -1;
    }
};
  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值