【算法刷题】贪心算法题型及方法归纳

news/2024/12/13 0:48:50/

贪心算法特点

从局部最优解推出全局最优,并且想不出来反例。贪心没有明确有规律的套路,而对于贪心的难题,更多的是难在思路上,要用一些转化问题的思维方法,然后,再根据局部最优解推出全局最优。

参考文章:贪心算法理论基础

1、发饼干

先排序,按饼干从小到大的顺序,依次分给从小到大排序的小朋友。

127、【贪心算法】leetcode ——455. 分发饼干:DFS+双指针法(C++版本)

2、0 水准线

  1. count用来记录当前子序列的相加和,当count大于0时,继续相加。当count小于或等于0时,重新开始选取子序列。
    以count是否为0判定的原因:若后续为正数时,没有这个负数更好,若后续为负数时,越加只会越小)
    129、【贪心算法】leetcode ——53. 最大子数组和(贪心算法)(C++版本)

  2. 满足条件的差值总和一定大于等于0,起始点之后区间一定大于等于0,区间小于时,更新起始点。
    134、【贪心算法】leetcode ——134. 加油站(贪心策略)(C++版本)

3、高度差模型问题

将问题图形化为高度差模型,根据题中会有的情况,出现某一坡度情形时,执行对应的情况。
在这里插入图片描述

  1. 获取每个“小山峰”(前升坡,后降坡)
    128、【贪心算法】leetcode ——376. 摆动序列(C++版本):判定之前高度差和当前高度差的正负情况

  2. 获取每个“上升坡度”
    130、【贪心算法】leetcode ——122. 买卖股票的最佳时机 II(贪心算法)(C++版本):升坡时进行一次买卖,降坡或平坡时只买不卖。

4、区间问题

(1)区间范围问题

将问题转化为区间覆盖问题,更新区间右边界,看最大区间能否覆盖到最后一个位置
在这里插入图片描述

  1. 每次获取最大跳跃步数
    131、【贪心算法】leetcode ——55. 跳跃游戏(贪心策略)(贪心算法)(C++版本):每次在区间范围内移动,获取最大可覆盖范围

  2. 在当前可获取的最大跳跃范围内,找到最优位置
    132、【贪心算法】leetcode ——45. 跳跃游戏 II(贪心策略)(C++版本) :在给定的跳跃范围内寻找最优跳跃位置(后续跳跃距离更远),到达最大范围边界时,进行跳跃更新。

  3. 更新最远区间边界
    140、【贪心算法】leetcode ——763. 划分字母区间(区间边界更新)(C++版本):先记录每个字母的最远位置,每获取一个字母就查看是否会有更远区间,更新区间边界,到达边界时,更新起始边界继续遍历。

(2)区间重叠问题

先按从打到小或从小到大排序,每次对前后两个区间关系进行判断,对重叠区间或非重叠进行操作。

两区间关系:
(1)不重叠
在这里插入图片描述
(2)交叉重叠
在这里插入图片描述
(3)包含重叠
在这里插入图片描述

  1. 更新区间
    138、【贪心算法】leetcode ——452. 用最少数量的箭引爆气球(贪心重叠问题)(C++版本):重叠时候更新最后一个气球的右区间,不重叠时弓箭数加一。

  2. 法一: 以左边界排序,更新右边界,法二: 以有边界排序,记录不重叠区间
    139、【贪心算法】leetcode ——435. 无重叠区间(更新区间+记录不重叠区间)(C++版本)

  3. 合并重叠区间
    141、【贪心算法】leetcode ——56. 合并区间(区间重叠解法+双指针解法)(C++版本):前后量区间对比,有重叠合并,无重叠,将前面的加入结果集。

5、多维度问题

需要考虑多个条件,若仅一趟遍历会很复杂,因此将每一个维度分成一趟遍历情况。

  1. 左值大于右值,左值小于右值,两个维度
    135、【贪心算法】leetcode ——135. 分发糖果(多维度贪心)(C++版本):第一趟,从左到右遍历,对于左值<右值,进行加一。第二趟,再从右到左遍历,对于右值>左值,取max(上述已完成数值, 右值+1)。

  2. 身高从大到小,大于此身高的个数,两个维度
    137、【贪心算法】leetcode ——406. 根据身高重建队列(多维度贪心)(C++版本):第一趟,按从大到小排列。第二趟,在第一趟的基础上,将人数作为插入下标,插入结果集。

6、模拟变化

  1. K次取反
    133、【贪心算法】leetcode ——1005. K 次取反后最大化的数组和(模拟变化+贪心策略)(C++版本):先变负数,若K对负数操作完后还不为0,对最小非负数进行操作,奇数时取反,偶数时不变。

  2. 根据各种情况进行操作
    135、【贪心算法】leetcode ——860. 柠檬水找零(贪心策略)(C++版本):先找大钱,再找小钱

7、单调递增的数字

根据最大递增数的特性,当不满足情况时,改变第i位为9,第i - 1位的数值位数减一。
143、【回溯算法】leetcode ——738. 单调递增的数字:暴力法+贪心法(C++版本)


http://www.ppmy.cn/news/22720.html

相关文章

【JavaEE】什么是线程池

目录 一、线程池的概念 二、线程池的工作流程 &#xff08;1&#xff09;线程参数 &#xff08;2&#xff09;拒绝策略 &#xff08;3&#xff09;线程池的工作流程 &#xff08;4&#xff09;线程池的参数设置 三、标准库中的线程池 &#xff08;1&#xff09;Execut…

【二分查找法及其应用】

文章目录一. 前提二. 基本思路三. 代码实现四. 封装在STL中的二分查找算法五. 练习一. 前提 待查找的序列是有序的&#xff1b;待查找的 a 采取顺序存储结构。 二. 基本思路 设在升序序列 a [ low…high ] 查找的 k &#xff0c; 首先找中间值 mid a [ ( lowhigh )/2 ] ; 然…

Mask掩码

Python中Mask的用法引例Numpy的MaskedArray模块小于&#xff08;或小于等于&#xff09;给定数值大于&#xff08;或大于等于&#xff09;给定数值在给定范围内超出给定范围在算术运算期间忽略NaN和/或infinite值All men are sculptors, constantly chipping away the unwanted…

QWT--添加Label

文章目录一、前言二、添加画布标签三、游标读数一、前言 在使用QWT绘制曲线的时候&#xff0c;可能需要在画布上标明曲线的信息&#xff0c;例如我最近在做的静态录波&#xff0c;需要标明曲线的物理量&#xff0c;如下所示&#xff1a; 在QWT–数据游标一文中&#xff0c;其实…

【交互式用户流程与演示设计】上海道宁与​Overflow让您能更自信的展示您的设计

Overflow 让设计师和产品经理 能够自信地展示他们的设计 并讲述他们的设计故事 独特的动态和交互式演示 Overflow 的功能 使设计人员能够使用鼠标、键盘和手势 轻松导航用户流程 以闪电般的速度 放大和缩小以在重要时专注于细节 原型模式提供了 新的不同缩放级别和交互…

电力电子技术课程实验:实验一、DC/DC直流斩波电路制作与性能测试

电力电子技术课程实验&#xff1a;实验一、DC/DC直流斩波电路制作与性能测试实验一、DC/DC直流斩波电路制作与性能测试预习报告一、 知识准备二、降压斩波电路MATLAB/Simulink电路三、降压斩波电路MATLAB仿真四、 升压斩波电路MATLAB/Simulink电路五、升压斩波电路MATLAB仿真六…

【RuoYi-Vue-Plus】学习笔记 47 - 翻译功能 Translation 源码分析

文章目录前言参考目录功能代码实现及测试目录结构说明测试类功能调用流程分析1、翻译配置初始化 TranslationConfig#init2、翻译功能的实现2.1、创建自定义上下文序列化器 TranslationHandler#createContextual2.2、设置空值序列化器 TranslationBeanSerializerModifier#change…

C#里使用UdpClient和线程来创建UDP网络通讯

C#里使用UdpClient和线程来创建UDP网络通讯 在开发的过程中,时不时就需要使用到UDP通讯。 比如与仪器进行通讯,获取仪器的数据。 又或者与PLC通讯,而PLC采用UDP的协议,而不是使用TCP协议。 作为一个软件开发人员,所以必须要熟练地使用UDP进行通讯, 才可以随着应用范围的改…