码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基础算法之双指针


    一、相差不超过k的最多数

    给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 k 。问最多能选择多少个数?
    输入描述:
    第一行输入两个正整数 n和k。
    第二行输入 n个正整数ai,用空格隔开,表示这个数组。
    输出描述:
    一个正整数,代表能选的最多数量。
    数据范围:
    1≤n≤2×10^5

    1≤k,ai≤10^9

    示例1
    输入:
    5 3
    2 1 5 3 2
    复制
    输出:
    4
    复制
    说明:
    显然,1和5不能同时选。所以最多只能选4个数。

    解法:

    由题知,可以先排序,寻找最大值与最小值的差在差值范围内的最大值与最小值,计算允许差值区间的数据个数,更新最大与最小值,计算个数,取个数最大值为结果

    #include
    #include
    #include
    using namespace std;
    int main()
    {
        int n,gap,ret;
        cin>>n>>gap;
        vector<int>v;
        for(int i=0;i<n;i++)
        {
            cin>>ret;
            v.push_back(ret);
        }
        sort(v.begin(),v.end());
        int l=0,res=0;
        for(int i=0;i<n;i++)
        {
            while(v[i]-v[l]>gap)
                l++;
            res=max(res,i-l+1);
        }
        cout<<res;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    二、合并区间

    解法: 排序+贪心(推荐)

    • 既然要求重叠后的区间按照起点位置升序排列,我们就将所有区间按照起点位置先进行排序。使用sort函数进行排序,重载比较方式为比较interval结构的start变量。
    • 排序后的第一个区间一定是起点值最小的区间,我们将其计入返回数组res,然后遍历后续区间。
    • 后续遍历过程中,如果遇到起点值小于res中最后一个区间的末尾值的情况,那一定是重叠,取二者最大末尾值更新res中最后一个区间即可。
    • 如果遇到起点值大于res中最后一个区间的末尾值的情况,那一定没有重叠,后续也不会有这个末尾的重叠区间了,因为后面的起点只会更大,因此可以将它加入res。
      请添加图片描述
    class Solution {
    public:
        //重载比较
        static bool cmp(Interval &a, Interval &b) { 
            return a.start < b.start;
        }
        
        vector<Interval> merge(vector<Interval> &intervals) {
            vector<Interval> res;
            //去除特殊情况
            if(intervals.size() == 0) 
                return res;
            //按照区间首排序
            sort(intervals.begin(), intervals.end(), cmp); 
            //放入第一个区间
            res.push_back(intervals[0]); 
            //遍历后续区间,查看是否与末尾有重叠
            for(int i = 1; i < intervals.size(); i++){ 
                //区间有重叠,更新结尾
                if(intervals[i].start <= res.back().end) 
                    res.back().end = max(res.back().end, intervals[i].end);
                //区间没有重叠,直接加入
                else 
                    res.push_back(intervals[i]);
            }
            return res;
        }
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    时间复杂度:O(n log ⁡ 2 \log2 log2n),排序的复杂度为O(n log ⁡ 2 \log2 log2n),后续遍历所有区间的复杂度为O(n),属于低次幂,忽略
    空间复杂度:O(1),res为返回必要空间,没有使用额外辅助空间

  • 相关阅读:
    只能用于文本与图像数据?No!看TabTransformer对结构化业务数据精准建模
    macos 配置ndk环境
    《Python编程:从入门到实战》学习笔记(第2版) 第1-2章 起步&变量和简单数据类型
    05-接口和异常处理
    无锡布里渊——厘米级分布式光纤-锅炉安全监测解决方案
    [附源码]Python计算机毕业设计SSM教务管理系统(程序+LW)
    WSL安装和嵌入式Linux的树莓派环境设置和交叉编译
    java计算机毕业设计医院门诊预约系统源码+系统+mysql数据库+lw文档
    大学生游戏静态HTML网页设计 (HTML+CSS+JS仿英雄联盟网站15页)
    毕业季 | 华为专家亲授面试秘诀:如何拿到大厂高薪offer?
  • 原文地址:https://blog.csdn.net/qwer1234mnbv_/article/details/126084560
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号