Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Leetcode|基本二分搜索+左侧边界二分+右侧边界二分

Leetcode|基本二分搜索+左侧边界二分+右侧边界二分

作者头像
SL_World
发布于 2021-09-18 08:52:25
发布于 2021-09-18 08:52:25
1.9K00
代码可运行
举报
文章被收录于专栏:XX
运行总次数:0
代码可运行

文章目录

1 基本二分搜索

【区间】:[left, right]

【终止条件】:left = right + 1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int binarySearch(vector<int>& nums, int target) {
    // 区间[left, right]
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target)
            return mid;
        else if (nums[mid] < target)
            left = mid + 1;
        else if (nums[mid] > target)
            right = mid - 1;
    }
    return -1;
}

2 左侧边界二分

【区间】:[left, right)

【终止条件】:left = right

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**寻找左侧边界的二分搜索**/
int leftBound(vector<int>& nums, int target) {
    // 区间[left, right)
    int left = 0, right = nums.size();
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target)
            // 不返回,收缩右边界,找到左侧边界
            right = mid;
        else if (nums[mid] < target)
            left = mid + 1;
        else if (nums[mid] > target)
            right = mid;
    }
    if (left == nums.size()) return -1;
    return nums[left] == target ? left : -1;
}

3 右侧边界二分

【区间】:[left, right)

【注意】:最后是mid = left - 1

【终止条件】:left = right

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**寻找右侧边界的二分搜索**/
int rightBound(vector<int>& nums, int target) {
    // 区间[left, right)
    int left = 0, right = nums.size();
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target)
            // 不返回,收缩左边界,找到左右侧边界
            left = mid + 1;
        else if (nums[mid] < target)
            left = mid + 1;
        else if (nums[mid] > target)
            right = mid;
    }
    if (left == 0) return -1;
    return nums[left - 1] == target ? left - 1 : -1;
}

4 总结

致谢

感谢labudadong大佬的整理,以此学习

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[labuladong算法小抄]二分查找详解
有一天阿东到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把阿东拦下,要检查一下哪本书没有登记出借。阿东正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆…… 最终,检测了 logN 次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是阿东背着剩下的书走了。
唯一Chat
2021/01/13
9440
[labuladong算法小抄]二分查找详解
ChatGPT,为啥写二分搜索容易死循环?
这段时间ChatGPT在码农界,引起了不小轰动,最热的话题中有一个与程序员息息相关,它会写代码那程序员是不是会集体下岗?刚好最近听说了这么一句话,“90%程序员都写不对二分搜索”,那就整个二分搜索最常见的问题考考ChatGPT。
灬沙师弟
2023/03/22
5640
ChatGPT,为啥写二分搜索容易死循环?
二分查找算法详解
有一天阿东到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把阿东拦下,要检查一下哪本书没有登记出借。阿东正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆…… 最终,检测了 log2N 次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是阿东背着剩下的书走了。
五分钟学算法
2019/06/18
1.1K0
二分查找算法详解
二分搜索框架
注意事项 -搜索区间需要特别留意:[左开、右开] 还是 [左开、右闭) while 终止 是否需要带 =号, 区间与 最开始确定的搜索区间 二分搜索框架 int binarySearch(int num[], int target) { // 注意 二分搜索的区间是 [左开,右开] int left = 0; int right = num.length - 1; // 所以这里的终止条件是 left
艳龙
2021/12/16
2210
备战蓝桥杯————二分搜索(一)
1. 循环条件:确保在搜索范围内进行,即left <= right。 2. 中间位置的计算:使用left + (right - left) / 2而不是(left + right) / 2来避免整数溢出。 3. 边界更新:根据中间值与目标值的比较结果,更新左边界或右边界。 4. 返回值:如果找到目标值,返回其索引;如果未找到,返回一个特定的值(如-1)表示未找到。
小小程序员
2024/03/07
1430
备战蓝桥杯————二分搜索(一)
基于二分搜索法的floor与ceil
此时使用上述二分查找算法,搜索出来的index为3。那如果我想要获取最左侧等于target的index或最右侧等于target的index呢?此时上述算法失效!
公众号guangcity
2019/10/15
9750
我写了一个套路,助你随心所欲运用二分搜索
读完本文,可以去力扣解决如下题目: 875.爱吃香蕉的珂珂(Medium) 1011.在D天内送达包裹的能力(Medium)
labuladong
2021/09/23
1.1K0
(转载非原创)编程思想与算法leetcode_二分算法详解
答:要保证能遍历到数组的第一个元素和最后一个元素。因为初始化 h 的赋值是 len(nums) - 1,即最后一个元素的索引,而不是 len(nums)。
xlj
2021/07/31
3870
(转载非原创)编程思想与算法leetcode_二分算法详解
【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)
二分查找(Binary Search)是一种经典的算法,广泛应用于计算机科学中,尤其在处理有序数据时。其重要性体现在以下几个方面:
熬夜学编程的小王
2024/12/24
1460
【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)
【二分算法】——8个题目让你找到二分算法的感觉势如破竹
https://leetcode.cn/problems/binary-search/
用户11286421
2024/10/12
4720
【二分算法】——8个题目让你找到二分算法的感觉势如破竹
二分查找学习笔记
二分查找也称折半查找,它是一种效率较高的查找方法。二分查找,思路很简单,细节是魔鬼。
EmoryHuang
2022/10/28
2420
二分查找学习笔记
【python刷题】二分查找
当数组中存在重复的元素的时候,我们要返回左右边界的时候,当查找到该元素时,我们不能返回True或者Fasle,而是要不断的缩小边界。
西西嘛呦
2021/02/05
6340
【python刷题】二分查找
备战蓝桥杯————二分查找(二)
小小程序员
2024/03/07
1541
备战蓝桥杯————二分查找(二)
二分查找的细节总结
最近把leetcode上关于二分查找的简单题都刷差不多了,leetcode给我的技能树上点了二分查找
overme
2022/01/15
8030
二分查找的细节总结
精确与高效:二分查找的完整指南
二分查找是一种高效的搜索算法,以其简单优雅的实现和出色的性能被广泛应用于计算机科学和工程领域。从理论到实践,这一算法始终是理解数据结构与算法设计的基石。在本文中,我们将深入剖析二分查找的原理、实现和优化,帮助您掌握其核心思想与实际应用。
suye
2024/12/21
4590
【算法专题】二分查找
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 - 1。
YoungMLet
2024/03/01
1610
【算法专题】二分查找
【优选算法篇】剥洋葱式探索:用二分查找精准定位答案(下篇)
接上篇:【优选算法篇】寻找隐藏的宝藏:用二分查找打开算法世界的大门(上篇)-CSDN博客
熬夜学编程的小王
2024/12/24
800
【优选算法篇】剥洋葱式探索:用二分查找精准定位答案(下篇)
【C++】二分查找算法专题
二分查找是一个具有模版的算法,但他同时也是最恶心的算法之一,关键在于要注意的细节多一点,稍有不慎就会发生死循环,模版分为普通版的,可以解决大部分的问题,进阶版的可以解决更加上档次的二分题。
啊QQQQQ
2024/11/19
1070
【C++】二分查找算法专题
二分查找的通用模板
二分查找适用于对于有序数组的精确查找,例如从一个有序数组中找到指定元素的索引,可将时间复杂度从普通枚举的 O(n) 降至 O(log n) ,前提是数组必须是有序的,否则是没有办法使用二分查找的。二分查找的思想虽然简单,不过在实现过程中会有很多细节问题需要注意,例如判断循环是用left < right还是用left <= right,right是取最右的元素还是取数组的边界。本文想通过七个例题,约定一种规则或是模板,从此让写二分查找不再出现模棱两可的局面。
兜兜转转
2023/03/08
9530
Leetcode|区间首尾元素大小判断成序+二分查找|33. 搜索旋转排序数组
1 旋转数组的二分查找 在二分搜索基础上,判断左右区间中的收尾元素大小,来判断是否成序,不成序或target在这个区间则搜索,否则搜索另外一个区间 class Solution { public: int search(vector<int>& nums, int target) { int size = nums.size(); int left = 0, right = size - 1; while (left <= right) {
SL_World
2022/01/10
2850
Leetcode|区间首尾元素大小判断成序+二分查找|33. 搜索旋转排序数组
推荐阅读
相关推荐
[labuladong算法小抄]二分查找详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验