二分法闭区间开区间,二分法查找 左闭右开,划分区间

本文详细介绍了如何使用二分法解决两个不同的问题:寻找缺失的数字和搜索目标值的区间长度。在第一个问题中,通过不断划分区间[lo, hi),最终找到左侧边界lo,使得lo左侧的元素等于其索引,右侧不等于。在第二个问题中,通过两次二分查找,分别确定小于和大于目标值的区间的边界,计算它们之间的长度。这两个问题都展示了二分查找在左闭右开区间划分中的应用。
摘要由CSDN通过智能技术生成

二分法查找 左闭右开,划分区间

二分法查找 左闭右开,划分区间

第一题

d23d5bff8592615da630818a9b8b40fd.png

class Solution:

def missingNumber(self, nums: List[int]) -> int:

lo = 0

hi = len(nums)

while lo < hi:

mi = (lo + hi) // 2

if mi == nums[mi]:

lo = mi +1

else:

hi = mi

return lo

左闭右开的解法

[lo,hi) 表示待定的区间

[0,lo):表示等于的区间

[hi, len(nums) ) : 表示不等于的区间

最后返回的lo->hi, 表示一个以lo的左侧的分界线,左侧都等于,右边都不等于

写代码时,以划分区间为起点,怎样的条件可以正确的划分区间。

第二题

8679e17c41184007d07fec58456a3e9c.png

class Solution:

def search(self, nums: List[int], target: int) -> int:

# 绝对小于 target

lo = 0

hi = len(nums)

while lo < hi:

mid = (lo + hi) // 2

if nums[mid] < target:

lo = mid+1

else:

hi = mid

x1 = lo

# 绝对大于target

lo = 0

hi = len(nums)

while lo < hi:

mid = (lo + hi) // 2

if target < nums[mid]:

hi = mid

else:

lo = mid + 1

x2 = lo -1

return x2-x1+1

用划分区间的方法,使用二分法,划分两次

二分法查找 左闭右开,划分区间相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是使用JavaScript实现二分查找的示例代码,该代码假设输入数组已经按升序排序: ```javascript function binarySearch(arr, target) { let left = 0; let right = arr.length - 1; while (left <= right) { let mid = Math.floor((left + right) / 2); if (arr[mid] === target) { // 目标元素已找到 return mid; } else if (arr[mid] < target) { // 目标元素在右侧 left = mid + 1; } else { // 目标元素在左侧 right = mid - 1; } } // 目标元素不存在于数组中 return -1; } ``` 这个函数接受两个参数:一个已排序的数组 `arr` 和目标元素 `target`。在函数体内,我们使用 `left` 和 `right` 变量来跟踪数组的边界。在每次循环中,我们计算中间索引 `mid`,然后检查该元素是否等于目标元素。如果相等,我们就返回它的索引。如果不相等,我们根据 `mid` 与 `target` 的关系更新 `left` 和 `right` 变量,从而缩小搜索范围。 如果目标元素不在数组中,则函数返回 -1。 ### 回答2: 二分法查找是一种常用的查找算法,它可以在有序数组中快速定位某个特定元素的位置。 下面是用JavaScript实现二分法查找区间代码的示例: ```javascript function binarySearch(arr, target) { let left = 0; let right = arr.length - 1; while (left <= right) { let mid = Math.floor((left + right) / 2); if (arr[mid] === target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; } let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; let target = 6; let result = binarySearch(arr, target); console.log(result); // 输出6,表示目标元素6在数组中的索引位置 ``` 这段代码中,`binarySearch`函数接受一个有序数组`arr`和目标元素`target`作为输入参数。首先,我们定义了两个指针`left`和`right`,分别指向数组的起始位置和结束位置。接着,使用`while`循环来迭代查找。在每次迭代中,计算中间位置`mid`,然后比较`arr[mid]`与目标元素`target`的大小关系。如果`arr[mid]`等于`target`,则返回`mid`作为结果;如果`arr[mid]`小于`target`,则更新左指针`left`为`mid + 1`;如果`arr[mid]`大于`target`,则更新右指针`right`为`mid - 1`。直到找到目标元素或者左指针与右指针相遇,循环结束。 这段代码的时间复杂度是O(log n),其中n是数组的长度。由于每次迭代都将查找区间缩小一半,因此二分法查找算法的效率非常高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值