首页 > 编程语言 >C++STL库 二分查找,以及对set集合进行二分查找,来源于”leetcode7022. 限制条件下元素之间的最小绝对差“

C++STL库 二分查找,以及对set集合进行二分查找,来源于”leetcode7022. 限制条件下元素之间的最小绝对差“

时间:2023-08-13 14:11:16浏览次数:39  
标签:二分 leetcode7022 lower nums bound st 查找 ans

C++的头文件<algorithm>中有用于二分查找的函数,lower_bound()、upper_bound()以及binary_search():

lower_bound():返回大于等于目标值的第一个位置
upper_bound():返回大于目标值的第一个位置,
binary_search():若目标值存在则返回true,否则返回false

参数列表:(起始位置,结束位置,目标值)

 

STL库中的容器同样实现了二分查找函数,比如set、map有序容器均实现了上述lower_bound()、upper_bound()

在实际应用中容器的成员函数的查找效率比STL库中函数的查找效率高了几个数量级

例如在下面这个例子中,十万数据规模,分别调用STL库中的lower_bound()函数和set集合中的成员函数lower_bound()进行一万次二分查询,前者用时11s多,而后者只需要几毫秒。

 

以上来自今天力扣第 358 场周赛当中的第三题7022. 限制条件下元素之间的最小绝对差,使用窗口遍历+二分可以很方便的解决该问题,这也是一道完美应用数据结构的一道题。使用注释那条语句则会卡在用例2008/2013处

代码如下:

    class Solution
    {
    public:
        int minAbsoluteDifference(vector<int> &nums, int x)
        {
            if (nums.size() == 1)
                return 0;
            int i = 0, j = x, ans = INT_MAX, n = nums.size();
            set<int> st;
            for (; j < n; i++, j++)
            {
                st.insert(nums[i]);
                // auto it = lower_bound(st.begin(),st.end(),nums[j]);
                auto it = st.lower_bound(nums[j]);
                if (it == st.end())
                {
                    it--;
                    ans = min(ans, abs(*it - nums[j]));
                }
                else if (it == st.begin())
                {
                    ans = min(ans, abs(*it - nums[j]));
                }
                else
                {
                    ans = min(ans, abs(*it - nums[j]));
                    it--;
                    ans = min(ans, abs(*it - nums[j]));
                }
            }
            return ans;
        }
    };

 

 

 

 

 

标签:二分,leetcode7022,lower,nums,bound,st,查找,ans
From: https://www.cnblogs.com/odd-ryj/p/17626507.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:查找和最小的 K 对数字
    1.简述:给定两个以 非递减顺序排列 的整数数组 和  , 以及一个整数  。nums1nums2k定义一对值 ,其中第一个元素来自 ,第二个元素来自  。(u,v)nums1nums2请找到和最小的  个数对 , k(u1,v1) (u2,v2)(uk,vk) 示例1:输入:nums1=[1,7,11],nums2=[2,4,6],k=3......
  • 1517. 查找拥有有效邮箱的用户
    1517.查找拥有有效邮箱的用户2023年8月12日20:27:491517.查找拥有有效邮箱的用户简单SQLSchemaPandasSchema表:Users+---------------+---------+|ColumnName|Type|+---------------+---------+|user_id|int||name|varchar......
  • Python教程(7)——一文弄懂Python字符串操作(上)|字符串查找|字符串分割|字符串拼接|
    (Python字符串操作)字符串简介在计算机编程中,字符串是由字符组成的字节序列。在Python中,字符串是表示文本数据的数据类型,由一系列Unicode字符组成。字符串可以包含字母、数字、标点符号、空格以及其他特殊字符。实际工作当中,接触最多的可能就是字符串了。字符串也是Python中最......
  • Python教程(7)——一文弄懂Python字符串操作(上)|字符串查找|字符串分割|字符串拼接|
    目录字符串简介字符串查找使用in关键字使用find()方法使用index()方法使用正则表达式字符串替换使用replace()方法使用正则表达式使用字符串模板字符串分割字符串拼接使用加号(+)运算符使用字符串的格式化方法使用f-string(格式化字符串)使用字符串的join()方法字符串......
  • 二分板子
    1.求最大值最小while(l<=r){  mid=(l+r)>>1;  if(check(mid))ans=mid,r=mid-1;    elsel=mid+1; }例题洛谷p3853路标设置code#include<bits/stdc++.h>usingnamespacestd;intl,n,k,a[100010],r,ll,mid,ans,cnt;boolcheck......
  • 顺序查找(线性查找)
    博客地址:https://www.cnblogs.com/zylyehuo/#_*_coding:utf-8_*_fromcal_timeimport*@cal_timedeflinear_search(li,val):forind,vinenumerate(li):ifv==val:returnindelse:returnNoneli=list(range(100000......
  • locate快速查找某文件路径会报以下错误
    部分版本的linux系统使用locate快速查找某文件路径会报以下错误:-bash:locate:commandnotfound其原因是没有安装mlocate这个包安装:yum-yinstallmlocate安装完再尝试用locate定位内容,发现依然不好使,报了新的错误:locate:cannotstat()`/var/lib/mlocate/mlocate.db':No......
  • 实践|Linux 中查找和删除重复文件
    动动发财的小手,点个赞吧!如果您习惯使用下载管理器从互联网上下载各种内容,那么组织您的主目录甚至系统可能会特别困难。通常,您可能会发现您下载了相同的mp3、pdf和epub(以及各种其他文件扩展名)并将其复制到不同的目录。这可能会导致您的目录中充满各种无用的重复内容。在本教......
  • 教你轻松查找Coinbase layer2 base链上的新上线项目
    作为Coinbaselayer2的base链自出生就自带光环,目前base链还没有发行代币的计划,后续是否会发行代币已经怎样获取空投资格,我们会随时关注并及时更新。本期主要讲解怎样查找base上新上线的代币,分析代币的流动性、交易情况、合约安全性综合判断代币的投资等级为代币的价值提供一个客观......
  • 简单使用二分查找法
    #include<stdio.h>intmain(void){ intarr[]={1,2,3,4,5,6,7,8,9,10}; intsz=sizeof(arr)/sizeof(arr[0]);//元素个数 intNumber=5;//需要查找的值 intright=sz-1;//右下标 intleft=0;//左下标 while(left<=right){ inthalf=(right+l......