贪心
1|0贪心算法满足两个性质:
(1)贪心选择性质
指的是原问题的整体最优解可以通过一系列局部最优的选择得到。运用同一个规则,将原问题变为一个相似的但规模更小的子问题,而后每一步都是当前最优的选择,这种选择依赖已作出的选择,但不依赖于未作出的选择。
(2)最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
2|0贪心算法重要的三个点:
(1)贪心策略
确定贪心策略,选择一个当前看上去最好的一个方案。有时候你可能能找到好几个方案,需要比较哪个方案是当前最好的。
(2)局部最优解
根据贪心策略,得到局部最优解。
(3)全局最优解
把所有的局部最优解合成为一个最优解。
不是贪心算法像冒泡排序,而是冒泡排序使用了贪心算法。
证明:
严谨使用贪心法求解最优化问题需要对采取的策略进行证明。证明的一般思路是使用反证法及数学归纳法,即假设策略不能导致最优解,然后通过一系列推到来得到矛盾,从而能证明此策略是最优的!
2|1会议安排问题
贪心策略
(1)从剩下未安排的会议中选择会议具有最早开始时间且与已安排的会议相容的会议安排,以增大时间资源的利用率。 False
(2)从剩下未安排的会议中选择会议持续时间最短且与已安排的会议相容的会议安排 False
(3)从剩下未安排的会议中选择会议具有最早结束时间且与已安排的会议相容的会议安排 Right
采用贪心策略,每次从剩下的会议中选择具有最早结束时间且与已安排的会议相容的会议安排。
3|0区间贪心
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
题目链接:https://leetcode-cn.com/problems/non-overlapping-intervals
采取的策略:保留结尾小且不相交的区间。(其实还可以先选择左端点最大的区间)
代码:
class Solution { public: int eraseOverlapIntervals(vector<vector<int>>& intervals) { if(intervals.empty()) return 0; int n = intervals.size(); sort(intervals.begin(),intervals.end(),[](vector<int> a,vector<int> b){ return a[1] < b[1]; }); int total = 0,prev = intervals[0][1]; for(int i=1;i<n;++i){ if(intervals[i][0] < prev) ++total; else prev = intervals[i][1]; } return total; } };
__EOF__

本文链接:https://www.cnblogs.com/techgy/p/14286686.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~