【JS力扣刷题笔记】二分查找

这是跟着代码随想录的顺序学习算法的第?天。(二刷)

以下是学习时自己的一些理解与笔记,如有错误欢迎指正与讨论。


二分查找

参考相关链接:

704. 二分查找

35. 搜索插入位置

34. 在排序数组中查找元素的第一个和最后一个位置

69. x 的平方根

367. 有效的完全平方数

代码随想录

力扣题解-labuladong


笔记

  • 二分法查找需要满足有序,且无重复元素

  • 防止溢出
const mid = left + Math.floor((right - left) / 2);

  • 关于 while 的终止条件和 right 的初始化之间的关系
  1. 左闭右开[left, right),这意味着 leftright 不能同时取得或者说二者不能相等,否则这个区间是无效的。

    故对应的终止条件应为 left === right,此时的 while 判断条件应该为 left < right

    区间右边是取不到的数,或者说是一定不符合要求的数,故初始化应为 right = nums.length

  2. 左闭右闭[left, right],这意味着 leftright 可以同时取得或者说二者可以相等,但 left不能比 right,否则这个区间是无效的。

    故对应的终止条件应为 left === right + 1,此时的 while 判断条件应该为 left <= right

    区间右边是取得到的数,或者说是有可能符合要求的数,故初始化应为 right = nums.length - 1


  • left = mid + 1right = mid - 1right = mid

根据选定的区间类型来判断是需要使其是有可能符合要求的数,还是一定不符合要求的数(这里的 mid 就是一定不符合要求的数


  • 搜索左边界

固定左边界,收缩右边界。


关于边界条件的判断可以这么来理解,因为需要搜索的是左边界,而左边界只会出现向右收缩的情况,也就是循环结束后得到的 left 只可能是 >= 0( left 初始条件) 的。

所以出现的越界情况只能是 left === nums.length ,和取不到 target 两种情况。


左闭右开

// 左闭右开
//...
if (nums[mid] === target) {
    right = mid; // 只收缩右边界,相当于固定左边界
}
//...

// 边界条件
// target 比所有数都大 或者 取不到 target
if (left === nums.length || nums[left] !== target) {
    return -1;
}

// target 在搜索区间的左边
return left;

左闭右闭

// 左闭右闭
//...
if (nums[mid] === target) {
    right = mid - 1; // 只收缩右边界,相当于固定左边界
}
//...

// 边界条件
// target 比所有数都大 或者 取不到 target
if (left === nums.length || nums[left] !== target) {
    return -1;
}

// target 在搜索区间的左边
return left;

  • 搜索右边界

固定右边界,收缩左边界。


关于边界条件的判断可以这么来理解,因为需要搜索的是右边界,而右边界只会出现向左收缩的情况,也就是循环结束后得到的 right 只可能是 <= nums.length(right的一种初始条件) 的。

所以出现的越界情况只能是 right === 0 (或者 -1) ,和取不到 target 两种情况。


左闭右开

// 左闭右开
//...
if (nums[mid] === target) {
    left = mid + 1; // 只收缩左边界,相当于固定右边界
}
//...

// 边界条件
// target 比所有数都小 或者 取不到 target
if (right === 0 || nums[right - 1] !== target) {
    return -1;
}

// target 在搜索区间的右边
return right - 1;

左闭右闭

// 左闭右闭
//...
if (nums[mid] === target) {
    left = mid + 1; // 只收缩左边界,相当于固定右边界
}
//...

// 边界条件
// target 比所有数都小 或者 取不到 target
if (right === -1 || nums[right] !== target) {
    return -1;
}

// target 在搜索区间的右边
return right;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值