首页 > 编程语言 >合并、删除区间算法C++代码

合并、删除区间算法C++代码

时间:2024-10-09 20:01:31浏览次数:12  
标签:begin const 删除 int interval second C++ 算法 left

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
  public:
    const int COMBINE_INT = 0; // 1表示整数点区间,比如[1:3]和[4:5]会合并为[1:5], 0则仅会合并[1:3]和[3:4]这类的区间。
    vector<pair<int, int>> interval;
    Solution() {}

    //用于手工添加全部区间后,统一合并
    void MergeAndSortInterval() {
        sort(interval.begin(), interval.end(), [](const auto &a, const auto &b) { return a.first < b.first; });
        for (int i = 0; i < interval.size() - 1; ++i) {
            if (interval[i].second >= interval[i + 1].first - COMBINE_INT) {
                interval[i].second = max(interval[i].second, interval[i + 1].second);
                interval.erase(interval.begin() + i + 1);
                --i;
            }
        }
    }
    //添加区间
    void AddInterval(const int left, const int right) {
        const auto it = lower_bound(interval.begin(), interval.end(), left,
                                    [](const pair<int, int> &p, const int left) { return p.first < left; });
        int i = max(0, int(distance(it, interval.begin())) - 1);
        if (it == interval.end()) {
            interval.push_back({left, right});
        } else {
            interval.insert(it, {left, right});
        }
        for (; i < interval.size() - 1; ++i) {
            if (interval[i].second >= interval[i + 1].first - COMBINE_INT) {
                interval[i].second = max(interval[i].second, interval[i + 1].second);
                interval.erase(interval.begin() + i + 1);
                --i;
            }
        }
    }
    //删除区间
    void DeleteInterval(const int left, const int right) {
        for (int i = 0; i < interval.size(); ++i) {
            if (left <= interval[i].first && interval[i].second <= right) {
                interval.erase(interval.begin() + i);
                --i;
            } else if (left <= interval[i].first && interval[i].first <= right) {
                interval[i].first = right + COMBINE_INT;
            } else if (left <= interval[i].second && interval[i].second <= right) {
                interval[i].second = left - COMBINE_INT;
            } else if (interval[i].first < left && right < interval[i].second) {
                const int newRight = interval[i].second;
                interval[i].second = left - COMBINE_INT;
                interval.insert(interval.begin() + i + 1, {right + COMBINE_INT, newRight});
            }
        }
    }
    //输出展示
    void Output() const {
        for (const auto p : interval) {
            cout << p.first << ":" << p.second << ", ";
        }
        cout << endl;
    }
};

int main() {
    Solution a;
    a.AddInterval(0, 10);
    a.AddInterval(3, 10);
    a.AddInterval(5, 13);
    a.AddInterval(4, 30);
    a.DeleteInterval(10, 20);
    a.AddInterval(4, 6);
    a.DeleteInterval(2, 3);
    a.DeleteInterval(1, 4);
    a.Output();
    return 0;
}

标签:begin,const,删除,int,interval,second,C++,算法,left
From: https://www.cnblogs.com/mariocanfly/p/18455030

相关文章

  • 实验1 现代C++编程初体验
    1.实验任务11#include<iostream>2#include<string>3#include<vector>4#include<algorithm>56usingnamespacestd;78//声明9//模板函数声明10template<typenameT>11voidoutput(constT&c);1213//普通函数声明......
  • C++模板与容器
    目录一、 模板1.函数模板2.类模板二、容器1.标准模板库STL2.概念3顺序容器3.1array数组2.3.2vector向量3.3list列表 3.4deque队列4关联容器5迭代器遍历一、 模板        模板可以让类或者函数支持一种通用类型,这种通用数据类型在实......
  • 关于C++中的异常概念理解
    1.基本概念异常,即exception,是C++中的基本概念之一,在某段程序发生无法继续正常执行的情况时,C++允许程序进行所谓抛出异常(有时也被称为吐出异常)的行为,这些被抛出的异常,会自动地从触发点开始向外传播,直到被捕获(有时也被称为吞下异常)或者程序终止。2.语法2.1抛出异常下面用一......
  • C++名字空间
    基本概念名字空间本质上是自定义作用域,由于C++设计的初衷是开发大规模软件,大量的软件库必然会加剧全局符号(变量、函数)的冲突,因此名字空间最基本的作用就是给不同的库和模块拥有自己的独特的作用域,处于不同名字空间中的重名符号相安无事,互不冲突,以此来大大提高编程的便利性。1.1......
  • 基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
    1.程序功能描述基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数。2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序whileCOUNT<=ItertionsֲL=zeros(Ant_Num,1);fori=1:Ant_NumInfor_Tabu_tmps=......
  • AI 学习方法与算法现状
    在人工智能(AI)的漫长历史中,我们见证了从早期的规则驱动系统到现代的机器学习模型的转变。AI的学习方法是其进步的核心,而算法现状则反映了当前技术的高度和未来的发展方向。Ⅰ.AI学习方法AI的工作原理基于深度神经网络,这是一种模仿人脑处理信息方式的计算模型。在设计AI系统时......
  • C++:自治我的世界2D.V0.0.4.5
    更新内容:增加挖掘进度,挖掘需要时间了,但还有BUG操作说明:A,D移动;W跳跃;上,下,右+上,右+下,左+上,左+下撸方块;M开关大地图#include<bits/stdc++.h>#include<windows.h>#defineKEY_DOWN(VK_NONAME)((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)usingnamespacestd;void......
  • C++消灭星星游戏编程【目录】
    欢迎来到zhooyu的专栏。主页:【zhooyu】专栏:【C++消灭星星游戏编程】特色:【保姆级教程,含每一课程源码】致力于用最简洁的语言,最简单的方式,最易懂的知识,带大家享受编程的快乐。消灭星星游戏编程演示效果消灭星星游戏编程演示效果本专栏内容:消灭星星的小游戏保姆......
  • 无人机集群路径规划:5种优化算法(APO、GOOSE、CO、PSO、PIO)求解无人机集群路径规划,提供M
     一、单个无人机路径规划模型介绍无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。二、无人......
  • 算法专题四: 前缀和
    目录1.前缀和2.二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为k的子数组6.和可被K整除的子数组7.连续数组8.矩阵区域和博客主页:酷酷学!!!感谢关注~1.前缀和算法思路:根据题意,创建一个前缀和数组,dp[i]=dp[i-1]+arr[i],再使用......