贪心策略(四)合并区间合集

news2024/9/27 19:19:57

目录

435. 无重叠区间移除元素的最小个数

 无重叠区间 区间组合结果

合并区间_牛客题霸_牛客网


435. 无重叠区间 移除元素的最小个数

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

来源:力扣(LeetCode)

 与上一博文活动安排那个题比较类似,那个是求活动的最大数量,那么就可以求出一个时间不冲突的区间的最大数量,用数组长度减去这个最大数量不就是我需要移除的元素最小数量嘛,就在返回结果上和之前不一样即可。

【解法一】将结束时间进行排序

class Com
{
    public:
        bool operator()(const vector<int>& left, const vector<int>& right)
        {
            return left[1]<right[1];
        }
};

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), Com());
        int pos = 0;
        int num = 1;
        for(int i = 1; i < intervals.size(); i++)
        {
            if(intervals[i][0] >= intervals[pos][1])
            {
                pos = i;
                num++;
            }
        }
        return intervals.size()-num;
    }
};

 【解法二】将开始时间进行排序

 如果是上述情况,不发生重叠,那么只需要更新pos位置即可,不需要移除元素

如果发生重叠,根据贪心思想,我需要给后面区间尽可能多的留出空间
所以遇到下一区间是前一个区间的子区间情况,移除前一个,保留下一个,更新pos位置
如果后一个区间end大于前一个区间的end那么移除后一个区间,不进行更新pos

class Com
{
    public:
        bool operator()(const vector<int>& left, const vector<int>& right)
        {
            return left[0]<right[0];
        }
};

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), Com());
        int pos = 0;
        int num = 0;
        for(int i = 1; i < intervals.size(); i++)
        {
            // 俩个活动不影响
            if(intervals[pos][1] <= intervals[i][0])
            {
                pos = i;
            }
            else
            {
                // 如果发生重叠,根据贪心思想,我需要给后面区间尽可能多的留出空间
                // 所以遇到下一区间是前一个区间的子区间情况,移除前一个,保留下一个更新pos位置
                // 如果后一个区间end大于前一个区间的end那么移除后一个区间,不进行更新pos
                if(intervals[pos][1] > intervals[i][1])
                    pos = i; 
                num++;
            }
        }
        return num;
    }
};

 无重叠区间 区间组合结果

 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠
 

 分成这三种情况哈,直接对应其各种类型进行处理即可(注意:划分不重复区间)

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Com
{
public:
    // 按start先后进行排序
    bool operator()(const Interval& left, const Interval& right)
    {
        return left.start < right.start;
    }
};

class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) 
    {
        sort(intervals.begin(), intervals.end(), Com());
        for(int i = 0; i < intervals.size()-1;)
        {
            if(intervals[i].end <= intervals[i+1].start)
                i++;
            else if(intervals[i].end > intervals[i+1].start && intervals[i].end < intervals[i+1].end)
                intervals.erase(intervals.begin()+i+1);
            else if(intervals[i].end >= intervals[i+1].end)
                intervals.erase(intervals.begin()+i);
        }
        return intervals;
    }
};

合并区间_牛客题霸_牛客网

给出一组区间,请合并所有重叠的区间。

请保证合并后的区间按区间起点升序排列。

数据范围:区间组数 0≤n≤2×1050≤n≤2×105,区间内 的值都满足 0≤val≤2×1050≤val≤2×105

要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)

进阶:空间复杂度 O(val)O(val),时间复杂度O(val)O(val)

 【解法一】重复的就进行合并,不重复的保留

空间复杂度O(1) 就是超时了。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Com
{
public:
    bool operator()(const Interval& left, const Interval& right)
    {
        return left.start < right.start;
    }
};

class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) 
    {
        if(intervals.size()==0)return intervals;
        sort(intervals.begin(), intervals.end(), Com());
        for(int i = 0; i < intervals.size()-1;)
        {
            if(intervals[i].end < intervals[i+1].start)
                i++;
            else if(intervals[i].end >= intervals[i+1].start && intervals[i].end < intervals[i+1].end)
            {
                intervals[i].end = intervals[i+1].end;    // 进行更新第一个区间的end
                intervals.erase(intervals.begin()+i+1); // 删除第二个子区间
            }  
            else if(intervals[i].end >= intervals[i+1].end)
                intervals.erase(intervals.begin()+i+1); // 删除这个子区间
        }
        return intervals;
    }
};

【解法二】空间换时间  用一个res容器来进行接受结果

对几种情况分好类就行

            if(res.back().end < intervals[i].start)        

                res.push_back(intervals[i]);

            else if(res.back().end == intervals[i].start)        

                res.back().end = intervals[i].end;

            else if(res.back().end < intervals[i].end)

                res.back().end = intervals[i].end;

            else if(res.back().end >= intervals[i].end)

                continue;

算法时间进行改进

上方代码加粗部分可以进行同样的操作,可以看出下面三种情况都满足end1 >= start2,前俩种选择end2进行更新back()、而最后一种选择end1进行更新,都选择的是最大的end所以使用

end = max(end1, end2);

 只有在俩个区间完全没有重叠的情况下,才会执行push_back操作

            if(intervals[i].start <= res.back().end)
                res.back().end = max(res.back().end, intervals[i].end);
            else                 
                res.push_back(intervals[i]);

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Com
{
public:
    bool operator()(const Interval& left, const Interval& right)
    {
        return left.start < right.start;
    }
};

class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) {
        vector<Interval> res;
        if(intervals.size()==0)return res;
        sort(intervals.begin(), intervals.end(), Com());
        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;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux调试器-gdb使用】

目录 1. 背景 2. 使用 3 命令总结 1. 背景 通过c语言的学习我们知道程序的发布方式有两种&#xff0c;debug模式和release模式&#xff0c;debug模式就是我们所说的调试模式。我们已经熟悉了在Windows平台下VS系列的调试&#xff0c;接下来我们一起在无图形化界面的Linux下来…

2023-01-18 flink 11.6 时间水印 和 窗口周期的关系计算方法

forBoundedOutOfOrderness 和 TumblingEventTimeWindowsforBoundedOutOfOrderness&#xff08;M&#xff09;TumblingEventTimeWindows&#xff08;N&#xff09;第一条数据的时间TS1第一个窗口期公式&#xff1a;窗口开始时间&#xff1a;win_start ((TS1-M)/N) * N窗口结束时…

Docker上部署goweb项目

文章目录一、安装go语言环境①下载go语言环境②解压go语言环境到指定目录③验证是否成功④配置镜像加速二、go语言项目配置第一种&#xff1a;先编译后打包&#xff08;分步部署&#xff0c;靠谱&#xff09;第二种&#xff1a;直接打包法三、成功运行一、安装go语言环境 ①下…

Zabbix 监控 Linux操作系统的监控指标

一、Zabbix 监控 Linux操作系统的监控指标 (仅供参考) Zabbi x默认使用Zabbix agent监控操作系统,其内置的监控项可以满足系统大部分的指标监控,因此,在完成Zabbix agent的安装后,只需在前端页面配置并关联相应的系统监控模板就可以了。 如果内置监控项不能满足监控需求…

走向开放世界强化学习、IJCAI2022论文精选、机器人 RL 工具、强化学习招聘、《强化学习周刊》第73期...

No.73智源社区强化学习组强化学习周刊订阅《强化学习周刊》已经开启“订阅功能”&#xff0c;扫描下面二维码&#xff0c;进入主页&#xff0c;选择“关注TA”&#xff0c;我们会向您自动推送最新版的《强化学习周刊》。本期贡献者&#xff1a;&#xff08;李明&#xff0c;刘青…

【Kotlin】类的继承 ① ( 使用 open 关键字开启类的继承 | 使用 open 关键字开启方法重写 )

文章目录一、使用 open 关键字开启类的继承二、使用 open 关键字开启方法重写一、使用 open 关键字开启类的继承 Kotlin 中的类 默认都是 封闭的 , 无法被继承 , 如果要想类被继承 , 需要在定义类时 使用 open 关键字 ; 定义一个普通的 Kotlin 类 : class Person(val name: S…

分析GC日志来进行JVM调优

不同的垃圾收集器产生的GC日志大致遵循了同一个规则&#xff0c;只是有些许不同&#xff0c;不过对于G1收集器的GC日志和其他垃圾收集器有较大差别&#xff0c;话不多说&#xff0c;正式进入正文。。。 什么时候会发生垃圾收集 首先我们来看一个问题&#xff0c;那就是什么时…

SpringBoot集成Elasticsearch7.4 实战(三)

本篇文章主要讲的是:在Springboot环境下&#xff0c;管理数据1. 数据管理1.1. 新增数据1.1.1. 单实例新增http方式提交数据&#xff0c;案例中我将数据格式做了规范&#xff0c;提交过程中需要指定索引名&#xff0c;以及JSON格式数据&#xff0c;这样尽可能在实际过程中做到通…

图论算法:普里姆算法(C++实现+图解)

文章目录最小生成树普里姆算法实现过程代码实现最小生成树 什么是最小生成树? 对于如图所示的带权无向连通图来说&#xff1a;从图中任意顶点出发&#xff0c;进行dfs或者bfs便可以访问到图中的所有顶点&#xff0c;因此连通图中一次遍历所经过的边的集合以及图中所有顶点的…

libvirt零知识学习2 —— libvirt源码下载

1. libvirt官网主页 libvirt的官网地址为&#xff1a; https://libvirt.org/ 主页如下图所示&#xff1a; 2. libvirt官网下载主页 libvirt的官网下载页地址为&#xff08;在主页中点击“Download”按钮即可跳转到&#xff09;&#xff1a; https://libvirt.org/downloads…

KaiwuDB 首席解决方案专家 金宁:1.0 时序数据库核心功能解读

以下是实录文章精简版欢迎大家点赞、收藏、关注&#xff01;大家好&#xff0c;今天介绍将分为 3 部分&#xff1a;首先从物联网蓬勃发展的时代背景出发&#xff0c;我们一起来看看数据库究竟将面临怎样的挑战与机遇&#xff1b;接着我将为大家详细 KaiwuDB 1.0 时序数据库的核…

(Java高级教程)第四章必备前端基础知识-第一节:HTML

文章目录一&#xff1a;HTML概述&#xff08;1&#xff09;概述&#xff08;2&#xff09;标签&#xff08;3&#xff09;HTML基本结构二&#xff1a;常用标签介绍&#xff08;1&#xff09;注释&#xff08;2&#xff09;标题&#xff08;3&#xff09;段落&#xff08;4&…

React Fragment

首先 我们编写这样一个例子 我们在创建一个react项目 在src的目录下创建components目录 components下创建一个子组件 我这里的名字叫 subset.jsx import React from "react";export default class subset extends React.Component{constructor(props){super(prop…

阿B百大名单公布,有你喜欢的up吗?

阿B在1月13日中午19点30分公布了2022百大UP主名单&#xff0c;那么今年的某站年度UP主都是谁呢&#xff1f;你喜欢的up入选了吗&#xff1f; 咱就来自己查一下都有谁入选了吧~ 我们是用python自动获取名单的哦。 环境使用 python 3.9 pycharm 模块使用 selenium 谷歌驱动 …

Java基础之《netty(26)—netty其他常用编解码器》

一、解码器-ReplayingDecoder 1、函数声明 public abstract class ReplayingDecoder<S> extends ByteToMessageDecoder 2、ReplayingDecoder扩展了ByteToMessageDecoder类&#xff0c;使用这个类&#xff0c;我们不必调用readableBytes()方法。参数S指定了用户状态管理…

【Linux】版本管理工具 Git

目录 一、什么是 Git 二、如何使用 Git 1、创建远程仓库 2、将远端仓库克隆到本地 3、将本地文件添加到仓库 3.1、三板斧第一招&#xff1a;文件添加 3.2、三板斧第二招&#xff1a;提交本地 3.3、三板斧第三招&#xff1a;提交远端 4、删除文件 5、删除仓库 一、什么是 Gi…

postman接口关联

有两种方法&#xff0c;使用json提取器实现接口关联&#xff0c;还有使用正则表达式提取器实现接口关联。方法一&#xff1a;使用json提取器实现接口关联第一个接口&#xff1a;//使用json提取器提取contractID、documentID//把返回的字符串格式的数据转换成对象的形式var resu…

SAP FICO 理解成本中心会计

成本中心会计 一、成本要素 管理会计&#xff08;CO&#xff09;的数据均来源于FI损益类科目&#xff0c;也就是说只有损益类科目才可以创建成本要素&#xff08;必须先创建损益类科目&#xff0c;后创建成本要素&#xff09;&#xff0c; 但是不一定所有的损益类科目都需要…

gma 气象气候函数包的简要介绍及运算过程主要问题说明(内存不足、出现 nan 等)及解决方法

0 概述 0.1 明确气候与气象的概念 气候(Climate)&#xff1a;是指一个地区大气物理特征的长期平均状态&#xff0c;具有一定的稳定性&#xff0c;且周期长。根据世界气象组织&#xff08;WMO&#xff09;的规定&#xff0c;一个标准气候计算时间为 30 年。 气象(Meteorology)&…

【论文笔记】一文读懂残差网络ResNet(附代码)

Residual Net论文笔记1. 传统深度网络的问题2. 残差结构和残差网络2.1 残差是什么2.2 残差模块 Residual Block2.3 基本模块BasicBlock和BottleNeck2.4 残差网络ResNet设计2.4.1 恒等映射与残差的连接3. Forward/Backward Propagation3.1 Forward propogation3.2 Back Propogat…