首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二进制搜索,何时使用right = mid - 1,何时使用right = mid?

二进制搜索是一种高效的搜索算法,用于在有序数组中查找特定元素的位置。在二进制搜索过程中,根据目标元素与中间元素的大小关系,可以决定更新右边界的方式。

当目标元素小于中间元素时,说明目标元素可能在左半部分,因此更新右边界为mid-1,将搜索范围缩小到左半部分。

当目标元素大于等于中间元素时,说明目标元素可能在右半部分,因此更新左边界为mid+1,将搜索范围缩小到右半部分。

当目标元素等于中间元素时,说明已经找到目标元素,可以直接返回其位置。

使用right = mid - 1的情况是在目标元素小于中间元素时,因为中间元素已经被判断过不是目标元素,所以可以将右边界缩小到mid-1。

使用right = mid的情况是在目标元素大于等于中间元素时,因为中间元素已经被判断过不是目标元素,所以可以将左边界缩小到mid。

二进制搜索的优势在于其时间复杂度为O(log n),相比于线性搜索具有更高的效率。它适用于有序数组,并且可以快速定位目标元素的位置。

腾讯云提供了多种云计算相关产品,其中与二进制搜索相关的产品包括:

  1. 腾讯云COS(对象存储):腾讯云对象存储(Cloud Object Storage,COS)是一种安全、低成本、高可扩展的云端存储服务,适用于存储和处理大规模非结构化数据。可以将有序数组存储在COS中,并通过腾讯云提供的API进行二进制搜索操作。详细信息请参考:腾讯云COS产品介绍
  2. 腾讯云CDN(内容分发网络):腾讯云内容分发网络(Content Delivery Network,CDN)是一种分布式部署的加速网络,通过将内容缓存到离用户更近的节点,提供快速的内容传输和访问体验。可以将有序数组的搜索结果缓存到CDN节点,加速搜索响应。详细信息请参考:腾讯云CDN产品介绍

请注意,以上仅为示例,实际使用时需要根据具体需求选择适合的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

将有序数组转换为二叉搜索

这个遍历过程可以使用递归非常直观地进行表示。 如何构造树 构造一棵树的过程可以拆分成无数个这样的子问题:构造树的每个节点以及节点之间的关系。...何时结束 当输入的递增数组为空时,只能构成一棵空树,此时返回空节点。 何时调用 当构造节点的左右子树时,对递增数组进行拆分并进行递归调用。...right = nums[mid+1:] # 递归调用 node.left = self.sortedArrayToBST(left) node.right...len(nums) / 2 left := nums[:mid] right := nums[mid+1:] node := &TreeNode{nums[mid], sortedArrayToBST...,右子树上所有节点的值均大于它的根节点的值 二叉搜索树的中序遍历结果为递增序列 参考资料 [1] 二叉搜索树: https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%85%

87420

二分查找的通用模板

规则约定 left统一采用数组最左端即下标为0,right采用数组最右端的元素(非边界),这样二分查找的范围是一个闭区间[left,right],包括扫描两端的元素; while中统一使用left<=right...上一题中,我们将数组划分为了[left,mid]和[mid+1,right],当mid不等于target时,mid可以排除掉,接下来搜索[left,mid-1]或者[mid+1,right],这是没有问题的...#相等时,右边界变成mid搜索[left,mid] elif nums[mid]<target: left=mid+1 #搜索[mid+1,right]...[mid]<target: left=mid+1 #搜索[mid+1,right] else: right=mid-1...即mid靠左或靠右; 经过判断后,确定搜索范围应该缩小在左半部分(修改right)或是右半部分(修改left),注意左右的边界元素是包含在内的; 退出循环的条件是left>right,确定你该在何时返回结果

87940

我作了首诗,保你闭着眼睛也能写对二分查找

我们这个算法中使用的是前者[left, right]两端都闭的区间。这个区间其实就是每次进行搜索的区间。 什么时候应该停止搜索呢?...当然是去搜索[left, mid-1]或者[mid+1, right]对不对?因为mid已经搜索过,应该从搜索区间中去除。 3、此算法有什么缺陷?...6、能不能想办法把right变成nums.length - 1,也就是继续使用两边都闭的「搜索区间」?这样就可以和第一种二分搜索在某种程度上统一起来了。...right] left = mid + 1; } else if (nums[mid] > target) { // 搜索区间变为 [left, mid-1] right = mid...,常见的手法是使用左闭右开的「搜索区间」,我们还根据逻辑将「搜索区间」全都统一成了两端都闭,便于记忆,只要修改两处即可变化出三种写法: int binary_search(int[] nums, int

47320

用javascript分类刷leetcode之递归&分治(图文视频讲解)

, mid + 1, right);//右边最大子序和 const cross = crossSum(nums, left, right, mid);//合并左右的之后的最大子序和 return...,使用分治,一分为二,等于x*x的n/2次方 }方法2:二进制图片思路:对n的二进制不断右移动,判断n的二进制最后一位是否是1, 如果是1则将结果乘以x。...n的二进制最后一位是否是1, 如果是1则将结果乘以x x *= x; n >>>= 1; //进行无符号右移1位,此处不能使用有符号右移(>>)...= Math.floor((lo + hi) / 2); let left = getMode(lo, mid); let right = getMode(mid + 1,...二叉搜索树的范围和 (easy)给定二叉搜索树的根结点 root,返回值位于范围 low, high 之间的所有结点的值的和。

34960

OMG,我从来没想过,二分查找还有诗?!

我们这个算法中使用的是前者[left, right]两端都闭的区间。这个区间其实就是每次进行搜索的区间。 什么时候应该停止搜索呢?...当然是去搜索[left, mid-1]或者[mid+1, right]对不对?因为mid已经搜索过,应该从搜索区间中去除。 3、此算法有什么缺陷?...6、能不能想办法把right变成nums.length - 1,也就是继续使用两边都闭的「搜索区间」?这样就可以和第一种二分搜索在某种程度上统一起来了。...right] left = mid + 1; } else if (nums[mid] > target) { // 搜索区间变为 [left, mid-1] right = mid...,常见的手法是使用左闭右开的「搜索区间」,我们还根据逻辑将「搜索区间」全都统一成了两端都闭,便于记忆,只要修改两处即可变化出三种写法: int binary_search(int[] nums, int

46730

leetcode刷题(86)——739.二分查找

我们这个算法中使用的是前者 [left, right] 两端都闭的区间。这个区间其实就是每次进行搜索的区间。 什么时候应该停止搜索呢?...6、能不能想办法把 right 变成 nums.length - 1,也就是继续使用两边都闭的「搜索区间」?这样就可以和第一种二分搜索在某种程度上统一起来了。...1, right] left = mid + 1; } else if (nums[mid] > target) { // 搜索区间变为 [left, mid-1] right...- 1 所以决定了我们的「搜索区间」是 [left, right] 所以决定了 while (left <= right) 同时也决定了 left = mid+1right = mid-1 因为我们只需找到一个...right,必须减一 对于寻找左右边界的二分搜索,常见的手法是使用左闭右开的「搜索区间」,我们还根据逻辑将「搜索区间」全都统一成了两端都闭,便于记忆,只要修改两处即可变化出三种写法: int binary_search

18720

二分法注意点_二分法怎么用

本文都会使用 else if,旨在讲清楚,读者理解后可自行简化。 其中 … 标记的部分,就是可能出现细节问题的地方,当你见到一个二分查找的代码时,首先注意这几个地方。...我们这个算法中使用的是前者 [left, right] 两端都闭的区间。这个区间其实就是每次进行搜索的区间,我们不妨称为「搜索区间」。 什么时候应该停止搜索呢?...当然是 [left, mid1] 或者 [mid + 1, right] 对不对?因为 mid 已经搜索过,应该从搜索区间中去除。 3. 此算法有什么缺陷?...搜索区间」是 [left, right] 3 所以决定了 while (left <= right) 4 同时也决定了 left = mid+1right = mid-1 5 6 因为我们只需找到一个...「搜索区间」是 [left, right) 3 所以决定了 while (left < right) 4 同时也决定了 left = mid + 1right = mid 5 6 因为我们需找到

31830

二分查找算法细节详解

本文都会使用 else if,旨在讲清楚,读者理解后可自行简化。 其中 … 标记的部分,就是可能出现细节问题的地方,当你见到一个二分查找的代码时,首先注意这几个地方。...我们这个算法中使用的是前者 [left, right] 两端都闭的区间。这个区间其实就是每次进行搜索的区间,我们不妨称为「搜索区间」。 什么时候应该停止搜索呢?...left : -1; 为什么 left = mid + 1right = mid - 1?...当然是 [left, mid - 1] 或者 [mid + 1, right] 对不对?因为 mid 已经搜索过,应该从搜索区间中去除。 此算法有什么缺陷?...而是缩小「搜索区间」的上界 right,在区间 [left, mid)中继续搜索,即不断向左收缩,达到锁定左侧边界的目的。

82720

面试前必知必会二分查找及其变种

((right - left ) >> 1) 两者作用是一样的,都是为了找到两指针的中 间索引,使用位运算的速度更快。...+ 1,下次则可以在新的 left 和 right 区间内搜索目标值,下图为移动前和移动后 (4)我们需要在 left 和 right 之间计算 mid 值,mid = 5 + (8 - 5)/ 2...如果 target > nums[mid] 则右半区间继续进行搜索,即 left = mid + 1; 若 target < nums[mid] 则在左半区间继续进行搜索,即 right = mid...,-1] 示例 3: 输入:nums = [], target = 0 输出:[-1,-1] 题目解析 这个题目很容易理解,我们在上面说了如何使用遍历解决该题,但是这个题目的目的就是让我们使用二分查找,...其实这个很简单,只要学会了二分查找,这个完全可以解决,我们先来看一个例子 我们需要从一个二维矩阵中,搜索是否含有元素 7,我们如何使用二分查找呢?

1.2K00
领券