贪心算法例题

article/2025/9/12 19:20:20

贪心算法经典例题解析

贪心法:遵循某种规律,不断贪心的选取当前最优策略的算法设计方法。

例一:分糖果

已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s >= 某个孩子的需求因子g时,代表该糖果可以满足该孩子;求使用这些糖果,最多能满足多少孩子?(注意,某个孩子最多只能用1个糖果满足)例如,需求因子数组g = [5, 10, 2, 9, 15, 9];糖果大小数组s = [6, 1, 20, 3, 8];最多可以满足3个孩子
思考:  
1、当某个孩子可以被多个糖果满足时,是否需要优先用某个糖果满足这个孩子?
  优先用最小的糖果满足孩子
2、当某个糖果可以满足多个孩子时,是否需要优先满足某个孩子?
  优先满足需求大的孩子
贪心策略:
1、某个糖果不能满足某个孩子时,则该糖果也一定不能满足需求因子更大的孩子。
2、某个孩子可以用更小的糖果满足,则没必要用更大糖果满足,因为可以保留更大的糖果满足需求因子更大的孩子。(贪心)
3、孩子的需求因子更小则更容易被满足,故优先需求因子小的孩子尝试,可以得到正确的结果。

算法思路:
  1、对需求因子数组g与糖果大小数组s进行从小到大的排序。
  2、按照从小到大的顺序使用糖果尝试是否可以满足某个孩子,每个糖果只尝试一次;若尝试成功,则换下一个孩子尝试,直到没有发现没有更多的孩子或者没有更多的糖果,循环结束。

class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
// 对g和s进行排序sort(g.begin(),g.end());sort(s.begin(),s.end());int child = 0;int cookie = 0;while(child < g.size() && cookie < s.size()){if(s[cookie] >= g[child]){child++;}cookie++;}return child;}
};

状态机的概念

状态机.png

图中每个圆代表一个状态,每个箭头表示一个if-else关系

例二:摇摆数组(376)

题目: 一个整数序列,如果两个相邻元素的差恰好正负(负正)交替出现,则该序列被称为摇摆序列。一个小于2个元素的序列直接为摇摆序列。
例如:
  序列[1, 7, 4, 9, 2, 5],相邻元素的差(6, -3, 5, -7, 3),该序列为摇摆序列。
  序列[1,4,7,2,5] (3, 3, -5, 3)、[1,7,4,5,5] (6, -3, 1, 0)不是摇摆序列。
  给一个随机序列,求这个序列满足摇摆序列定义的最长子序列的长度。
例如:
  输入[1,7,4,9,2,5],结果为6;输入[1,17,5,10,13,15,10,5,16,8],结果为7([1,17,10,13,10,16,8]);输入[1,2,3,4,5,6,7,8,9],结果为2。
解题思路(贪心思想):
  当序列有一段连续的递增(或递减)时,为形成摇摆子序列,我们只需要保留这段连续的递增(或递减)的首尾元素(最大或最小),这样更可能使得尾部的后一个元素成为摇摆子序列的下一个元素。

										 [1,17,5,10,13,15,10,5,16,8]    

摇摆序列.png

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if(nums.size() < 2)return nums.size();static const int BEGIN = 0;static const int UP = 1;static const int DOWN = 2;int STATE = BEGIN;int max_length = 1; // 摇摆序列最大长度最少为1// 循环处理nums中的数据for(int i = 1;i < nums.size(); i++){switch(STATE){case BEGIN:if(nums[i] > nums[i-1]){STATE = UP;max_length++;}else if(nums[i] < nums[i-1]){STATE = DOWN;max_length++;}break;case UP:if(nums[i] < nums[i-1]){max_length++;STATE = DOWN;}break;case DOWN:if(nums[i] > nums[i-1]){max_length++;STATE = UP;}break;}}return max_length;}
};   

例三:移除K个数字(402)

已知一个使用字符串表示的非负整数num,将num中的k个数字移除,求移除k个数字后,可以获得的最小的可能的新数字。(num不会以0开头,num长度小于10002)
例如:输入:num=“1432219”,k=3
  在去掉3个数字后得到的很多种可能中,如1432、4322、2219、1219、1229…;去掉数字4、3、2得到的1219最小!
贪心解题思路:
  从高位向低位遍历,如果对应的数字大于下一位数字,则把该数字去掉,得到的数字最小
暴力解法:
  去掉k个数字,即从最高位遍历k次。
用栈进行优化:

移除K个元素最小.png
移除K个元素02.png

1.当所有数字都扫描完成后,k仍然>0,应该做怎样的处理?例如: num = 12345,k = 3 时。
  **答:**如果扫描完成后k依然大于0,则从字符串最后删除元素
2.当数字中有0出现时,应该有怎样的特殊处理?例如: num = 100200, k = 1 时。
  **答:**如果为0但是栈不为空则入栈,否则不入栈
3.如何将最后结果存储为字符串并返回?
  **答:**可以用vector代替栈,因为队列可以进行尾部插入(back_push)和尾部删除(back_pop),删除完成后对队列进行头部出队(front_pop)并赋值给字符串

class Solution {
public:string removeKdigits(string num, int k) {// 定义一个vector,充当栈vector<int> S;string result="";// 循环遍历字符串for(int i = 0 ;i < num.length();i++){int number = num[i] - '0';while(S.size() != 0 && S.back() > number && k>0){S.pop_back();k--;}if(number != 0 || S.size() != 0)  // 不为0或者不为空都入栈{S.push_back(number);}}while(k>0 && S.size() != 0){S.pop_back();k--;}for(int i= 0;i<S.size();i++){result.append(1,'0'+S[i]);}if(result == ""){return "0";}return result;}
};

http://chatgpt.dhexx.cn/article/Zi62PhLG.shtml

相关文章

贪心算法(Java)

贪心算法 文章目录 贪心算法0、写在前面1、贪心算法的基本要素1.1 贪心选择性质1.2 最优子结构性质1.3 贪心算法与动态规划算法的差异 2、贪心算法的特点3、贪心法的正确性证明4、活动安排问题4.1 问题描述4.2 贪心法的设计思想4.3 两个反例 5、代码6、效率7、实例8、参考 0、写…

贪心算法(Java版本)

一、贪心算法 1、算法描述 贪心算法&#xff08;Greedy algorithm&#xff09;&#xff0c;又叫做贪婪算法。 在对问题求解时&#xff0c;不从整体考虑&#xff0c;而是从问题的某一个初始解出发&#xff0c;每一步选择中都采取在当前状态下最好或最优的选择&#xff08;局部…

Java贪心算法

1.Java贪心算法 1.1 贪心算法介绍 贪心算法是指在对问题进行求解时&#xff0c;在每一步选择中都采取最好或者最优(即最有利)的选择&#xff0c;从而希望能够导致结果是最好或者最优的算法贪心算法所得到的结果不一定是最优的结果(有时候会是最优解)&#xff0c;但是都是相对近…

C语言贪心算法

点击蓝字 关注我们 因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 来源于网络&#xff0c;侵删 01 基本概念 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#…

python贪心算法

文章目录 贪心算法1、分发饼干问题&#xff08;力扣455&#xff09;2、无重叠区间(力扣435)3、分发糖果&#xff08;力扣135&#xff09;4、种花问题&#xff08;力扣605&#xff09;5、用最少数量的箭引爆气球&#xff08;力扣452&#xff09;6、划分字母区间&#xff08;力扣…

算法-贪心算法

贪心算法 基本概念算法思想贪心算法就像周六晚上的动画片一样可遇不可求贪心解题步骤序列问题53. 最大子数组和 跳跃游戏55. 跳跃游戏跳跃游戏 II 分发糖果 基本概念 贪心算法又称贪婪算法&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。换句话说&am…

三大算法之三:贪心算法及其例题详解

目录 零.前言 1.区分贪心算法和动态规划 1.动态规划 2.贪心算法 3.共通点 2.贪心算法得到最优解的条件 1.具有优化子结构 2.具有贪心选择性 3.任务安排问题 1.问题定义 2.优化子结构 3.证明贪心选择性 4.总结 4.哈夫曼编码问题 1.问题定义 2.优化子结构 3.贪心…

一看就懂的贪心算法

如何理解贪心算法 我们先看一个例子 假设有一个可以容纳100kg物品的背包&#xff0c;背包可以装各种物品&#xff0c;我们有以下五种豆子&#xff0c;每种豆子的重量和总价值各不相同。为了让背包中所装物品的总价值最大&#xff0c;我们如何选择在背包中装哪些豆子&#xff…

从零开始学贪心算法

本文在写作过程中参考了大量资料&#xff0c;不能一一列举&#xff0c;还请见谅。 贪心算法的定义&#xff1a; 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;只做出在某种意义上的局部最优…

如何用wireshark过滤媒体流

进入媒体开发领域的同行来说&#xff0c;一般都会遇到媒体流过滤的问题。那么如何进行媒体流过滤呢&#xff1f; 首先是在媒体服务器的网卡上抓包。其次是获取到通话SIP信令的callid。并根据callid查到sip信令中SDP的IP和PORT。然后用callid及ip和port进行过滤&#xff0c;如果…

WireShark过滤器应用

在工作中我们常会用到wireshark抓取数据包进行分析&#xff0c;当使用wireshark默认设置时&#xff0c;会捕获到大量冗余的数据包&#xff0c;如果没有过滤器过滤&#xff0c;我们很难找到自己想要抓取的数据&#xff0c;这个时候就需要用到wireshark的过滤器来过滤&#xff0c…

Wireshark过滤器写法总结

目录 Wireshark提供了两种过滤器&#xff1a; 1、捕获过滤器 2、显示过滤器 过滤器具体写法 1、显示过滤器写法 1、过滤值比较符号及表达式之间的组合 2、针对ip的过滤 3、针对协议的过滤 4、针对端口的过滤&#xff08;视传输协议而定&#xff09; 5、针对长度和内…

Wireshark 过滤器使用

捕获过滤器&#xff1a; 在抓包之前就设定好过滤条件&#xff0c;然后只抓取符合条件的数据包。 显示过滤器&#xff1a; 在已捕获的数据包集合中设置过滤条件&#xff0c;隐藏不想显示的数据包&#xff0c;只显示符合条件的数据包。 过滤器比较符号 过滤ip和mac地址 ip 改成…

wireshark过滤规则详解

过滤器有两种&#xff1a; 一种是显示过滤器&#xff0c;就是主界面上那个&#xff0c;用来在捕获的记录中找到所需要的记录 一种是捕获过滤器&#xff0c;用来过滤捕获的封包&#xff0c;以免捕获太多的记录。 在Capture -> Capture Filters 中设置 保存过滤&#xff0c…

wireshark 过滤器规则

1、过滤 IP 如来源 IP 或目标 IP。 例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107 或者ip.addr eq 192.168.1.107 // 都能显示来源 IP 和目标 IP 2、过滤端口 例子: tcp.port eq 80 // 不管端口是来源的还是目标的都显示 tcp.port 80 tcp.port eq 2722 tcp.…

Wireshark过滤器语法

1.官网地址 点击进入 2.捕获过滤器 使用捕获过滤器Wireshark只捕获满足过滤器条件的数据包进来。捕获过滤器采用BPF语法表达式&#xff0c;表达式由如下及部分组成: Dir 指明传输方向是前往还是来自 例如&#xff1a;src、dst Type 指出名字或数字所代表的意&#xff0c;例如…

wireshark过滤telnet

ip.addr172.16.xxx.xxx && tcp.port8080 telnet 端口可以换。可以是23也可以是任意

wireshark过滤器

1、几种条件操作符 eq 等于 ip.addr 192.168.0.1 ip.addr eq 192.168.0.1 ! ne 不等于 !ip.addr192.168.0.1 ip.addr! 192.168.0.1 ip.addr ne 192.168.0.1 > gt 大于 frame.len>64 frame.len gt 64 < lt 小于 frame.le…

Wireshark抓包及常用过滤方法

一、抓包 实际遇到组件服务间的报错问题时&#xff0c;通过日志无法快速看出原因&#xff0c;可通过抓包的方式来快速查看接口返回信息及错误提示&#xff0c;使用如下命令可实现对某个端口进行抓包&#xff1a; tcpdump -i any -w /opt/xxx.pcap tcp port 8150 # 8150为调用…

Wireshark 实用篇:Wireshark 抓包常用过滤命令

目录 前言 正文 一、根据 IP 地址过滤 二、根据端口过滤 三、根据协议过滤 四、根据 Payload Type 条件过滤 五、根据组合条件过滤 六、实例分析 前言 使用 Wireshark 工具进行网络抓包属于研发人员的基础技能&#xff0c;如果你还不了解&#xff0c;建议从现在开始…