算法学习笔记(7.4)-贪心算法(区间调度问题)

news2024/11/20 6:37:19

目录

##什么是区间调度问题

##贪心解法

 ##具体的例题示例讲解

##452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

##435. 无重叠区间 - 力扣(LeetCode)

##56. 合并区间 - 力扣(LeetCode)


##什么是区间调度问题

区间调度问题是一个经典的贪心算法问题:

通常描述为:给定一组活动,每个活动都有一个开始时间和结束时间。只有一个活动能在同一时间段内进行。目标是找到最大数量的互不相交的活动。

##贪心解法

  1. 从区间集合 intvs 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(开始最早)。
  2. 把所有与 x 区间相交的区间从区间集合 intvs 中删除。
  3. 重复步骤 1 和 2,直到 intvs 为空为止。之前选出的那些 x 就是最大不相交子集。

 ##具体的例题示例讲解

##452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

##思路

1.第一步按照最先开始时间排序(结束最早)

2.然后开始遍历数组,找到有交集的区间,进行修改

3.将当前位置的结束区间和上一个跟当前有交集的结束区间的最小值赋值给当前位置的结束区间

4.样例解释{first:[1,4],[2,3],result:[1,4],[2,3]; second:[1,5],[2,6],result:[1,5],[2,5],third:[1,3],[2,3],result:[1,3],[2,3]}

5.解释以下second:

当然下面一个气球有可能和上面两个气球都重合,如果只和上面一个气球重合而不和上上面气球重合的话,那么还需要额外的一支箭去引爆。

为了实现判断,当两支气球重合时,我们可以把右边界缩小为两个气球右边界较小的一个值(因为此时新气球的左边界一定大于等于上面两个气球的左边界,所以不用判断),如果新气球左边界小于上面气球的右边界,那么就不需要额外的箭就能引爆。

##代码示例

//c++代码示例
class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if (points.size() == 0)
        {
            return 0 ;
        }
        sort(points.begin(),points.end(),[](const vector<int>& a,const vector<int>& b)
        {
            return a[0] < b[0] ;
        }) ;
        int ans = 1 ;
        for (int i = 1 ; i < points.size() ; i++)
        {
            if (points[i][0] <= points[i-1][1])
            {
                points[i][1] = min(points[i][1],points[i-1][1]) ;
            }
            else
            {
                ans++ ;
            }
        }
        return ans ;



    }
};
//python代码示例
class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        points.sort(key = lambda x : x[0] ,reverse =False)
        
        if len(points) == 0 :
            return 0
        ans = 1
        for i in range(1,len(points)) :
            if (points[i][0] <= points[i-1][1]) :
                points[i][1] = min(points[i][1],points[i-1][1])
            
            else :
                ans += 1
        return ans 

##435. 无重叠区间 - 力扣(LeetCode)

##思路

跟上一个题目的思路一样

具体的细节:当本区间左边界比上一个区间右边界小的时候我们就需要去删除了。删除在代码上只需要将此区间右边界设置为此区间与上一个区间中的较小值就可以了。如果此区间左边界大于等于上一个区间右边界,那么就证明两个区间没有重合,不需要进行操作。

##代码示例

//c++代码示例
class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),[](const vector<int>& a,const vector<int>& b)
        {
            return a[0] < b[0] ;
        }) ;

        int ans = 0 ;

        for (int i = 1 ; i < intervals.size() ; i++)
        {
            if (intervals[i][0] < intervals[i-1][1])
            {
                intervals[i][1] = min(intervals[i-1][1],intervals[i][1]) ;
                ans++ ;
            }
        }
        return ans ;
    }
};
//python代码示例
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key = lambda x : x[0] ,reverse = False)
        if (len(intervals) == 0) :
            return 0
        ans = 0
        for i in range(1,len(intervals)) :
            if (intervals[i][0] < intervals[i-1][1]) :
                intervals[i][1] = min(intervals[i][1],intervals[i-1][1])
                ans += 1
        return ans 

##56. 合并区间 - 力扣(LeetCode)

##思路

先进行排序,然后用此区间左边界与上一个区间右边界进行比较,如果满足重叠,则进行记录。

##代码示例

//c++代码示例
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ans ;

        sort(intervals.begin(),intervals.end(),[](const vector<int>& a,const vector<int>& b)
        {
            return a[0] < b[0] ;
        }) ;

        for (int i = 0 ; i < intervals.size() ; i++)
        {
            if (!ans.empty() && intervals[i][0] <= ans[ans.size()-1][1])
            {
                ans[ans.size()-1] = {min(ans[ans.size()-1][0],intervals[i][0]),max(ans[ans.size()-1][1],intervals[i][1])} ;
            }
            else
            {
                ans.push_back({intervals[i][0],intervals[i][1]}) ;
            }
        }
        return ans ;


    }
};
//python代码示例
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        ans = []

        intervals.sort(key=lambda x: x[0])

        for i in range(len(intervals)):
            if ans and intervals[i][0] <= ans[-1][1]:
                ans[-1] = [min(ans[-1][0], intervals[i][0]), max(ans[-1][1], intervals[i][1])]
            else:
                ans.append([intervals[i][0], intervals[i][1]])

        return ans

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

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

相关文章

学习周报:文献阅读+Fluent案例+Fluent相关算法学习

目录 摘要 Abstract 文献阅读&#xff1a;求解正逆运动波问题的物理信息神经网络 文献摘要 讨论|结论 理论基础 KWM&#xff08;运动波动方程&#xff09; Hard constraint &#xff08;硬约束方式&#xff09; 具有重新分布的搭配点的PINN 具有停止梯度的分数阶方程 …

解决Nginx出现An error occurred问题

每个人遇到Nginx的An error occurred情况可能都不一样&#xff08;见图1&#xff09;&#xff0c;Nginx造成该错误的原因&#xff1a; 1. 我在配置域名解析成IP时&#xff0c;没有把所有解析配置都修改&#xff0c;见图2&#xff1a;解析 *.hanxiaozhang.xyz 配置的是新IP地…

4.通用编程概念

目录 一、变量与常量1.1 变量1.2 常量 二、遮蔽三、数据类型3.1 标量类型1. 整型2. 浮点型3. 布尔类型4.字符类型 3.2 复合类型1. 元组2. 数组 四、函数五、语句和表达式六、函数的返回值 一、变量与常量 1.1 变量 在Rust中默认的变量是不可变的&#xff0c;如果修改其值会导致…

汽车EDI——Volvo EDI 项目案例

项目背景 作为Volvo的长期合作伙伴&#xff0c;C公司收到Volvo的EDI对接邀请&#xff0c;需要实现EDI对接。C公司将会面临哪些挑战&#xff1f;又应该相应地选择何种EDI解决方案呢&#xff1f; 汽车行业强调供需双方的高效协同&#xff08;比如研发设计、生产计划、物流信息等…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难&#xff1a;将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40&#xff0c;按照向导将fedora40安装到真机的sda7分区中得到报错如下内容&#xff1a; Failed to find a suitable stage1 device: E…

最大矩形问题

柱状图中最大的矩形 题目 分析 矩形的面积等于宽乘以高&#xff0c;因此只要能确定每个矩形的宽和高&#xff0c;就能计算它的面积。如果直方图中一个矩形从下标为 i 的柱子开始&#xff0c;到下标为 j 的柱子结束&#xff0c;那么这两根柱子之间的矩形&#xff08;含两端的柱…

论文敲公式敲到“崩溃”?合合信息扫描全能王“公式识别”一键解决公式提取难题

毕业季临近&#xff0c;全国高校毕业生陆续进入了忙碌的“答辩季”。进入“百米冲刺”阶段&#xff0c;论文至关重要。对于理科工学生而言&#xff0c;论文中的数理化公式&#xff0c;稍不注意就容易输错&#xff0c;手动输入误差难以避免。 近日&#xff0c;合合信息旗下扫描…

【C++课程学习】:C++入门(函数重载)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f308;函数重载&#xff1a; &#x1f349;1.参数个数不同&#xff1a; &#x1f349;2.参数…

【计算机视觉(9)】

基于Python的OpenCV基础入门——形态学操作 形态学操作腐蚀膨胀开运算闭运算梯度运算顶帽黑帽 形态学操作代码实现以及效果图 形态学操作 形态学操作是数字图像处理中的一种方法&#xff0c;用于改变和提取图像中的结构和形状信息。它基于图像的形状和大小特征&#xff0c;通过…

【Framework系列】Excel转Json,配置表、导表工具介绍

今天来介绍一下Framework系列的配置部分&#xff0c;这一部分归属于Framework-Design之中。读过《Framework系列介绍》的小伙伴应该了解整个Framework框架是由多个工程项目组成&#xff0c;没看过的小伙伴可以点击链接了解一下。 Framework-Design设计的初衷是给策划同学用的&a…

为Android组件化项目搭建Maven私服

概览 文章目录 概览前言搭建 maven 私服服务器环境jdk安装配置nexus安装配置管理创建存储点、仓库 项目中使用 maven 私服上传 module 到仓库自动发布 module手动上传单个aar包 引用仓库中的 modulebuild.gradle引入远程module FAQ开发阶段有些module用远程依赖&#xff0c;有些…

苹果警告部分 iPhone 用户称他们遭到雇佣间谍软件攻击

苹果警告部分 iPhone 用户称他们遭到“雇佣间谍软件攻击 苹果正在提醒用户注意针对 iPhone 的新一轮已识别雇佣间谍软件攻击。可能的受害者已经收到来自苹果的电子邮件&#xff0c;其中描述了该攻击如何“远程破坏 iPhone”。据路透社报道&#xff0c;印度和其他 91 个国家的受…

内容产品运营方案业务架构解析与实践探索

### 背景 在信息爆炸的时代背景下&#xff0c;内容产品运营成为各行各业竞争的重要环节。构建合理的内容产品运营方案业务架构&#xff0c;能够帮助企业更好地管理内容生产、推广和变现&#xff0c;提升品牌影响力和商业价值。 ### 业务架构设计 #### 1. 内容生产与管理 建立…

一套java开发的(未来工厂核心MES系统成品源码)技术架构:java+springboot 支撑多端管理,可商用

MES定义为“位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统” 20世纪90年代初期&#xff0c;中国就开始对MES以及ERP的跟踪研究、告知或试点&#xff0c;而且曾经发言 “管控一体化”&#xff0c;“人、财、物、产、供、销”等颇具中国独具一格的CIMS、…

input组件 type为nickname pc端获取不到这个绑定的值?

一、input组件 type为nickname pc端获取不到这个绑定的值&#xff1f; 在pc端 使用input blur 事件获取选择昵称结果失败 代码如下&#xff1a; <input type"nickname" bindblur"binname" name"nickName" placeholder"请输入昵称"…

2024年政治经济学与社会科学国际会议(ICPESS 2024)

2024年政治经济学与社会科学国际会议 2024 International Conference on Political Economy and Social Sciences 会议简介 2024年政治经济学与社会科学国际会议是一个致力于探讨政治经济学与社会科学交叉领域前沿问题的国际盛会。本次会议汇聚了全球顶尖的专家学者、研究人员和…

传统产品经理AI产品经理

前言 随着科技的发展&#xff0c;技术的革新&#xff0c;AI技术当今已经渗入到各个行业里边&#xff0c;身处其中的产品经理也面临的新的挑战和机遇&#xff0c;下面是笔者整理分享的关于传统的产品经理如何顺应时代发展&#xff0c;成功转换成AI产品经理的相关内容&#xff0…

vcruntime140.dll干嘛的?丢失了vcruntime140.dll要咋办?

vcruntime140.dll干嘛的&#xff1f;vcruntime140.dll就是一个dll文件&#xff0c;它对于很多程序都是有用的&#xff0c;如果没有了它&#xff0c;那么你的有些程序是打不开的&#xff01;所以当你丢失的时候&#xff0c;你就要想办法去修复vcruntime140.dll文件&#xff0c;假…

那个会用AI绘画的设计师,刚刚加薪了!不会AI的打工人却只能被优化?

大家好&#xff0c;我是向阳。 随着ChatGPT引领人工智能的热潮&#xff0c;AI绘画也悄然崭露头角&#xff01; 插画师、建筑师、平面设计师等艺术创作领域的从业者&#xff0c;感受到了前所未有的压力 当一个设计师能有多难&#xff1f; 设计师需要在&#xff1a;主管/经理…

SQL面试问题集

目录 Q.左连接和右连接的区别 Q.union 和 union all的区别 1、取结果的交集 2、获取结果后的操作 Q.熟悉开窗函数吗&#xff1f;讲一下row_number和dense_rank的区别。 Q.hive行转列怎么操作的 Q.要求手写的题主要考了聚合函数和窗口函数&#xff0c;row_number()&#…