首页 > 其他分享 >二分查找

二分查找

时间:2024-12-02 17:10:48浏览次数:3  
标签:二分 return val int mid 查找 left size

[Algo] 二分查找

注:Algo系列基于左神算法教程,提供C++实现。

1. 经典算法

// 1. 经典二分查找:给定有序序列,查找val,存在返回(任一)索引,否则返回-1
int binarySearch(const vector<int> &v, int val)
{
    if (v.size() == 0) return -1;
    int left = 0, right = v.size() - 1, mid = 0;
    while (left <= right)
    {
        mid = (left + right) / 2;
        // mid = left + (right - left) >> 1
        if (v[mid] == val) return mid;
        else if (v[mid] < val) left = mid + 1;
        else right = mid - 1;
    }
    return -1;
}

2. 大于等于num的左边界

// 2. 给定有序序列和val,查找不小于val的最左位置,存在返回索引,否则返回-1
int leftNoLessThan(const vector<int> &v, int val)
{
    if (v.size() == 0) return -1;
    int left = 0, right = v.size() - 1, mid = 0, ans = -1;
    while (left <= right) 
    {
        mid = (left + right) / 2;
        if (v[mid] >= val)
        {
            ans = mid;
            right = mid - 1;
        } 
        else
        {
            left = mid + 1;
        }
    }
    return ans;
}

3. 峰值点

// 3. 给定序列(未必有序)(相邻元素不等),找出(任一)峰值点,返回索引
int findPeakIndex(const vector<int> &v)
{
    if (v.size() == 1) return 0;
    if (v[0] > v[1]) return 0;
    if (v[v.size() - 1] > v[v.size() - 2]) return v.size() - 1;
    // [1, v.size() - 2]必存在峰值点
    int left = 1, right = v.size() - 2, mid = 0;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (v[mid] < v[mid - 1]) right = mid - 1; // [left, mid - 1]必存在峰值点
        else if (v[mid] < v[mid + 1]) left = mid + 1; // [mid + 1, right]必存在峰值点
        else return mid;
    }
    return -1; // 永不执行
}

标签:二分,return,val,int,mid,查找,left,size
From: https://www.cnblogs.com/yaoguyuan/p/18582249

相关文章

  • Java入门:21.System类,Runtime类,Arrays类的常用方法,二分查找算法
    1System类System.exit(0); //手动关闭应用程序​System.currentTimeMillis();//获得当前系统时间的毫秒数​System.out;//获得一个打印流,可以实现控制台打印System.out.print();//打印内容(不换行)System.out.println();//打印内容,并换行System.out.printf();//......
  • 线性探测法的查找函数 作者 DS课程组 单位 浙江大学
    虽然但是,我真的讨厌c语言这样一大坨typedef命名来命名去的,很多时候其实我们会写,但是看不懂这个存储结构函数的接口定义PositionFind(HashTableH,ElementTypeKey);其中HashTable是开放地址散列表,定义如下:#defineMAXTABLESIZE100000/*允许开辟的最大散列表长度*/t......
  • 亚马逊僵尸链接查找与合并全流程教学-月亮树跨境教程
    一、僵尸链接是什么二、高效采集僵尸链接三、僵尸链接合并实操1、前提条件2、修改品牌3、下载合并表格4、表格填写5、表格上传 一、僵尸链接是什么:僵尸链接,通俗来讲就是链接还挂在亚马逊上,但是却没有卖家。点进去这个链接你会看到提示“Currentlyunavailable(目前不......
  • Java面试要点54 - Java List的二分查找算法
    文章目录一、引言二、二分查找的基本原理三、JavaCollections工具类中的二分查找四、自定义比较器的二分查找实现五、处理特殊情况六、性能优化与最佳实践七、总结一、引言在Java程序开发中,查找操作是一个非常基础且关键的算法需求。其中,二分查找(BinarySearch)......
  • 【二分查找】力扣 275. H 指数 II
    一、题目二、思路h指数是高引用引用次数,而citations数组中存储的就是不同论文被引用的次数,并且是按照升序排列的。也就是说h指数将整个citations数组分成了两部分,左半部分是不够引用h次的论文,右半部分论文的引用次数都是大于等于h的。因此,可以采用二分查找的......
  • 二分图
    定义对于一张无向图\(G\),若所有点可以分为两个点集\(A\)和\(B\),且\(A\)和\(B\)的内部没有连边,那么我们称\(G\)可以划分为一张二分图。二分图的划分不唯一,也不一定联通,也不一定有环存在的充要条件若无向图\(G\)是二分图,那么\(G\)没有奇环。若无向图\(G\)没......
  • 【C++算法】21.二分查找算法_山脉数组的峰顶索引
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:852.山脉数组的峰顶索引题目描述:解法暴力解法:若:arr=[0,1,2,3,2,1,0]可以定义一个指针指向第一个元素,如果它后面的元素比它大,那么他就不是峰值。当第一次遇到一个数是大于后面那个数的时候,那个数就......
  • 【C++习题】22.二分查找算法_寻找峰值
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:162.寻找峰值题目描述:解法暴力解法:三种山峰的情况开始元素比它后面一个元素大的话直接就是山峰了(因为nums[-1]=nums[n]=-∞)普通山峰最后一个元素比前面一个元素大的话直接就是山峰了二分算......
  • 24/11/30 ABC381+莫队+分块+整体二分学习笔记
    [ABC381D]好题。由于题目描述中提到了取出的子序列长度必须是偶数个,所以可以考虑对于原来的\(a\)序列每次进行长度为\(2\)的尺取,这时候不难发现对于开头位置具有两个答案,一个是从\(1\)为开头,一个是从\(2\)为开头,所以写个函数封装一下就好了,类似这种cout<<max(solve(1),solve(2......
  • 第七章:查找
    7.3树表的查找当表插入、删除操作频繁时,使用动态查找表,可以维护表的有序性。其中,表结构在查找过程中动态生成,给定key,若表中存在,则成功返回;否则,插入key。7.3.1二叉排序树定义:二叉排序树(BinarySortTree)又称二叉搜索树、二叉查找树。非空二叉排序树应该满足以下条件:(1)若......