[Algorithm][贪心][合并区间][无重叠区间][用最少数量的箭引爆气球]详细讲解

news2024/12/31 7:17:22

目录

  • 1.合并区间
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.无重叠区间
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.用最少数量的箭引爆气球
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.合并区间

1.题目链接

  • 合并区间

2.算法原理详解

  • 区间问题思路
    • 排序
      • 左端点(本题)
      • 右端点
    • 根据排序后的结果,总结规律
  • 解法:排序(左端点) + 贪心
    • 性质能够合并的区间,都是连续的
    • 如何合并?
      • 求并集
        请添加图片描述

3.代码实现

vector<vector<int>> merge(vector<vector<int>>& intervals) 
{
    // 排序
    sort(intervals.begin(), intervals.end());

    // 合并区间
    vector<vector<int>> ret;
    int left = intervals[0][0], right = intervals[0][1];

    for(int i = 0; i < intervals.size(); i++)
    {
        int a = intervals[i][0], b = intervals[i][1];
        if(a <= right) // 有重叠
        {
            right = max(right, b);
        }
        else // 无重叠
        {
            ret.push_back({left, right});
            left = a;
            right = b;
        }
    }

    // 最后一个区间
    ret.push_back({left, right});

    return ret;
}

2.无重叠区间

1.题目链接

  • 无重叠区间

2.算法原理详解

  • 解法:排序(左端点) + 贪心
  • 问题转化:移除最少区间 <–> 保留更多区间
    • 优先干掉右端点长的区间 --> 长的区间更后续区间重叠的概率更大
      请添加图片描述

3.代码实现

int eraseOverlapIntervals(vector<vector<int>>& intervals) 
{
    // 排序
    sort(intervals.begin(), intervals.end());

    // 移除区间
    int ret = 0;
    int left = intervals[0][0], right = intervals[0][1];
    for(int i = 1; i < intervals.size(); i++)
    {
        int a = intervals[i][0], b = intervals[i][1];
        if(a < right) // 有重叠
        {
            ret++; // DELETE
            right = min(right, b); // 贪心, 删除右端点较大的区间
        }
        else // 无重叠
        {
            right = b;
        }
    }

    return ret;
}

3.用最少数量的箭引爆气球

1.题目链接

  • 用最少数量的箭引爆气球

2.算法原理详解

  • 问题抽象:区间问题
  • 问题转化:最少的弓箭数量 --> 一只箭应该引爆更多的气球 --> 将互相重叠的所有区间都拿出来引爆
  • 解法:排序(左端点) + 贪心
    • 性质:按照左端点排序之后,互相重叠的区间是连续的(约束更强)
    • 如何合并?
      • 求交集
        请添加图片描述

3.代码实现

int findMinArrowShots(vector<vector<int>>& points) 
{
    // 排序
    sort(points.begin(), points.end());

    // 求互相重叠区间的数量
    int right = points[0][1];
    int ret = 1;
    for(int i = 1; i < points.size(); i++)
    {
        int a = points[i][0], b = points[i][1];
        if(a <= right) // 有重叠
        {
            right = min(right, b);
        }
        else // 无重叠
        {
            ret++;
            right = b;
        }
    }

    return ret;
}

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

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

相关文章

Docker安装及使用记录

本文汇总一下 Docker 的安装过程和使用过程中的问题 安装过程 Windows Linux 更新软件源&#xff1a;Linux安装前可先更新以下各自发行版包管理器的软件源 卸载旧版本&#xff1a;如果之前安装过的话&#xff0c;可以先卸载 yum remove docker docker-common docker-sel…

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…

基于SpringBoot“花开富贵”花园管理系统【附源码】

效果如下&#xff1a; 系统注册页面 系统首页界面 植物信息详细页面 后台登录界面 管理员主界面 植物分类管理界面 植物信息管理界面 园艺记录管理界面 研究背景 随着城市化进程的加快和人们生活质量的提升&#xff0c;越来越多的人开始追求与自然和谐共生的生活方式&#xf…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

YOLOv11改进,YOLOv11添加DCNv4可变性卷积(windows系统成功编译),二次创新C2f结构,全网最详细教程

改进训练结果前: 二次创新C2f结构训练结果: 摘要 引入了可变形卷积 v4 (DCNv4),这是一种为广泛视觉应用设计的高效且有效的操作算子。DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以…

【动态规划-4.2 最长递增子序列(LIS)】力扣300. 最长递增子序列

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 子序列 。 示例 1&…

LVM——让Linux磁盘空间的弹性管理

什么是LVM&#xff1f; LVM(Logical Volume Manager)逻辑卷管理是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对 磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制&#xff0c;对于其它的类UNIX操作系统&#xff0c;以及windows操…

用Manim简单解释奇异值分解(SVD)和图像处理方面的应

一&#xff0c;介绍 奇异值分解&#xff08;SVD&#xff09;是一种重要的矩阵分解技术&#xff0c;在统计学、信号处理和机器学习等领域有广泛应用。对于任意给定的矩阵 A&#xff08;可以是任意形状的矩阵&#xff09;&#xff0c;SVD将其分解为三个特定的矩阵的乘积&#x…

【时间盒子】-【9.任务设置项】自定义任务名称、任务时长等设置项组件

Tips: Stage、Link装饰器的使用&#xff1b; 参考我的帖子&#xff1a;https://developer.huawei.com/consumer/cn/forum/topic/0208152234389094513?fid0101587866109860105 一、预览 红色框&#xff1a;任务设置项列表&#xff0c;把它定义为一个组件对象SettingList。绿…

Python 工具库每日推荐【PyPDF2】

文章目录 引言Python PDF 处理库的重要性今日推荐:PyPDF2 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:PDF文件合并案例分析高级特性加密和解密PDF添加水印扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏…

Vue基础(2)检测数据原理~生命周期

文章目录 检测数据原理1.更新时遇到的问题2.检测数据的原理-对象3. vue.set()的使用 收集表单数据过滤器内置指令1.v-text2.v-html3.v-cloak4.v-once5.v-pre 自定义指令生命周期1.挂载流程2.更新流程3.销毁流程 检测数据原理 1.Vue会监视data中的所有层次的数据 2.如何监测对象…

10月8日星期二今日早报简报微语报早读

10月8日星期二&#xff0c;农历九月初六&#xff0c;早报#微语早读。 1、我国自主研制的300兆瓦级F级重型燃气轮机在上海首次点火成功&#xff1b; 2、2024国庆档超21亿收官&#xff1a;《志愿军&#xff1a;存亡之战》票房8亿夺冠&#xff1b; 3、维克托安布罗斯&#xff0…

STM32工程环境搭建(库函数开发)

目录 1、移植固件库&标准库 2、新建工程 以STM32f401作为例子进行环境搭建 1、移植固件库&标准库 ①桌面创建工程文件夹并且提取内核文件 用户文件&#xff1a;用户自己编写的程序文件 .c .h文件 .c文件&#xff1a;具体函数功能源代码 .h文件&#xff1a;宏定义…

ctf.bugku - bp (弱密码top1000)

题目来源&#xff1a; bp - Bugku CTF 首先&#xff0c;下载top1000 &#xff0c;弱密码文本&#xff1a; PasswordDic/top1000.txt at master k8gege/PasswordDic GitHub 访问页面&#xff0c;随便输入个密码 发送请求到 intruder 以密码问参数 加载top1000.txt 密码文本&…

springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数

springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数。近期网站经常有人恶意访问&#xff0c;提交了很多垃圾信息。为了屏蔽这类灌水帖&#xff0c;打算屏蔽ip地址&#xff0c;限制24小时内只能访问1次某个接口。下面是测试的案例代码内容。 1&#xff1a;首先&am…

实验三 Web基础-JavaScript

实验三 Web基础-JavaScript 目的&#xff1a; 1、理解和掌握Javascript基本语法 2、掌握JavaScript操作表单对象的方法 3、理解和掌握JavaScript的函数与事件 4、理解JavaScript的内置对象 实验要求&#xff1a; 1、使用JavaScript语言实现实验要求 2、要求提交实验报告&…

HTB:Pennyworth[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What does the acronym CVE stand for? 2.What do the three letters in CIA, referring to the CIA triad in cybersecurity, stand for? 3.What is the version of the service running on port 8080? 4.What version of Jenkins i…

【C++11】可变模板参数

文章目录 可变模板参数的概念递归函数方式展开参数包 STL容器中的empalce相关的接口函数emplace 与 insert / push_back 的区别 可变模板参数的概念 可变参数模板是 C11 引入的一种模板特性&#xff0c;允许定义可以接收任意数量参数的模板&#xff0c;广泛应用于函数和类的设计…

【js逆向学习】极志愿 javascript+python+rpc

JSRPC使用方式 逆向目标逆向过程逆向分析1、什么是 websocket2、websocket的原理3、总体过程3.1 环境说明3.2 python服务端代码3.3 python客户端代码 4、Sekiro-RPC4.1 执行方式4.2 客户端环境4.3 参数说明4.4 SK API4.5 python代码调试4.6 代码注入流程 逆向总结 逆向目标 网…

【STM32开发之寄存器版】(六)-通用定时器中断

一、前言 STM32定时器分类 STM32103ZET6具备8个定时器TIMx(x 1,2,...,8)。其中&#xff0c;TIM1和TIM8为高级定时器&#xff0c;TIM2-TIM6为通用定时器&#xff0c;TIM6和TIM7为基本定时器&#xff0c;本文将以TIM3通用定时器为例&#xff0c;分析STM32定时器工作的底层寄存器…