资讯详情

LeetCode 621任务调度器:贪心算法与冷却时间优化

📅 2026/10/27 15:05:26 | 华诺云谱 👁 阅读
LeetCode 621任务调度器:贪心算法与冷却时间优化
1. 任务调度器问题概述今天我们来深入探讨LeetCode Hot100中的第621题任务调度器。这道题在技术面试中出现的频率相当高尤其是在考察贪心算法和模拟场景的应用能力时。题目描述的是给定一个用字符数组表示的CPU需要执行的任务列表其中每个字母代表一种任务任务可以以任意顺序执行并且每个任务都需要1个单位时间执行。在任何一个单位时间CPU可以执行一个任务或者处于待命状态。但是两个相同种类的任务之间必须有长度为n的冷却时间求完成所有任务所需的最短时间。举个例子假设我们有任务列表[A,A,A,B,B,B]冷却时间n2。那么一个可能的执行顺序是A-B-待命-A-B-待命-A-B总共需要8个单位时间。2. 问题分析与解题思路2.1 问题核心理解这道题的核心在于如何合理安排任务执行顺序使得在满足冷却时间限制的前提下总执行时间最短。关键在于处理出现频率最高的任务因为它们需要最多的冷却时间间隔。我最初接触这个问题时尝试了几种直观的排列方式发现如果不考虑任务频率的分布很容易陷入局部最优解。后来通过分析多个测试用例才逐渐理解了其中的规律。2.2 关键观察点经过多次尝试和思考我总结出几个关键观察最高频任务决定了基本框架出现次数最多的任务会形成执行的基本骨架其他任务可以填充在冷却间隔中较低频的任务可以插入高频任务之间的间隔当任务种类足够多时冷却时间可能被完全填满此时总时间就是任务总数举个例子对于任务[A,A,A,B,B,B,C,C,D,D]n2的情况A出现3次B出现3次C出现2次D出现2次我们可以这样安排A-B-C-A-B-D-A-B-C-D总时间为10正好等于任务总数2.3 数学公式推导基于这些观察我们可以推导出一个通用公式最短时间 max(任务总数, (max_freq - 1) * (n 1) count_max)其中max_freq是最高频任务的次数count_max是有多少个任务具有max_freq的次数n是冷却时间这个公式的意思是最高频任务会形成(max_freq - 1)个完整周期每个周期长度为(n 1)最后再加上count_max个任务完成最后一轮。3. 算法实现与优化3.1 基础实现步骤基于上述分析我们可以按照以下步骤实现算法统计每个任务的频率找出最高频率max_freq统计具有max_freq的任务数量count_max计算两种可能情况1任务可以完美填充冷却间隔时间为(max_freq - 1)*(n 1) count_max情况2任务种类很多冷却间隔被完全填满时间为任务总数取两者中的较大值3.2 Python代码实现def leastInterval(tasks, n): if n 0: return len(tasks) freq [0] * 26 for task in tasks: freq[ord(task) - ord(A)] 1 max_freq max(freq) count_max freq.count(max_freq) return max(len(tasks), (max_freq - 1) * (n 1) count_max)3.3 复杂度分析时间复杂度O(N)其中N是任务数量。我们需要遍历任务列表统计频率然后进行常数时间的计算。空间复杂度O(1)因为我们只使用了一个固定大小的数组(26个元素)来存储频率。3.4 优化思路虽然上述解法已经相当高效但我们还可以做一些微优化使用Counter代替手动统计频率from collections import Counter freq Counter(tasks) max_freq max(freq.values()) count_max sum(1 for v in freq.values() if v max_freq)这样代码更简洁但实际性能差异不大。提前处理n0的特殊情况可以节省不必要的计算。4. 实际应用与变种问题4.1 实际应用场景这个问题虽然以CPU任务调度为背景但其核心思想可以应用于许多实际场景项目管理中的资源分配当某些资源需要冷却时间时交通信号灯调度不同方向的绿灯需要间隔时间工厂生产线安排某些机器完成一个产品后需要冷却4.2 常见变种问题在面试中这个问题可能会有以下几种变种不同任务有不同的执行时间冷却时间不是固定的可能根据任务类型变化考虑任务之间的依赖关系多核CPU的情况任务可以并行执行4.3 一个变种问题的解法示例假设我们有一个变种问题不同任务可能有不同的执行时间。我们可以这样思考仍然优先安排执行时间最长的高频任务在冷却间隔中尽可能安排其他任务可能需要使用优先队列堆来动态选择下一个要执行的任务5. 常见错误与调试技巧5.1 新手常见错误在解决这个问题时我见过也犯过以下几种常见错误没有考虑多个任务具有相同最高频率的情况例如[A,A,A,B,B,B]n2错误计算(3-1)*(21)17实际应为8忽略了任务种类很多时的情况例如[A,B,C,D,E,F,G]n2错误地应用公式而实际上应该直接返回任务数量7错误理解冷却时间的含义冷却时间n意味着两个相同任务之间必须有n个不同的任务或待命有些同学误以为是n个单位时间间隔5.2 调试技巧当你的代码不能通过所有测试用例时可以尝试以下调试方法打印中间变量输出频率统计结果输出max_freq和count_max的值输出公式计算的两部分结果构造边界测试用例n0的情况所有任务都相同的情况任务种类刚好填满冷却间隔的情况手动模拟小规模例子在纸上画出任务排列验证你的算法是否正确6. 性能对比与算法选择6.1 不同解法的性能对比除了我们讨论的贪心算法外这个问题还有其他几种解法优先队列堆方法每次选择剩余次数最多的任务需要模拟整个过程时间复杂度O(N log N)因为每次堆操作需要log N时间排序方法每次对任务频率排序也需要模拟整个过程时间复杂度O(N^2)或O(N log N)取决于排序频率相比之下我们的数学方法是最优的因为它只需要线性时间。6.2 为什么贪心算法有效贪心算法在这里有效的原因是局部最优选择优先安排高频任务能导致全局最优解高频任务是限制因素必须优先处理填充冷却间隔的方式不会影响高频任务的安排6.3 算法选择建议在实际面试或应用中首先解释数学方法的思路和正确性实现简洁的数学解法如果有时间可以讨论其他解法的优缺点对于变种问题可能需要采用模拟或优先队列的方法7. 编码实现细节与技巧7.1 语言特定实现技巧在不同语言中实现这个算法有一些小技巧Python:使用collections.Counter可以简化频率统计max()和count()函数非常高效Java:可以使用int[26]来统计频率需要手动找出max_freq和count_maxC:类似Java但可以使用std::max_element和std::count7.2 边界条件处理特别注意以下几种边界条件n0的情况可以直接执行所有任务无需冷却所有任务相同的情况如[A,A,A]n2 → 7任务种类很多的情况如[A,B,C,D]n2 → 47.3 测试用例设计为了验证代码的正确性建议设计以下几组测试用例常规情况[A,A,A,B,B,B], n2 → 8[A,A,A,B,B,B,C,C], n2 → 8边界情况[A], n100 → 1[A,B,C,D,E,F], n0 → 6特殊分布[A,A,A,A,B,B,B,C,C,D], n2 → 10[A,A,B,B,C,C,D,D,E,E], n1 → 108. 面试中的应用与回答策略8.1 面试中的考察重点面试官提出这个问题时通常关注以下几点能否正确理解问题并转化为数学模型能否发现最高频任务的关键作用能否处理多个任务具有相同最高频率的情况代码实现的简洁性和正确性8.2 回答策略建议在面试中回答这个问题时建议采用以下策略首先明确问题要求确认理解冷却时间的定义通过小例子解释你的思路推导出数学公式并解释其正确性讨论边界条件和特殊情况编写代码并在过程中解释关键步骤最后用测试用例验证你的代码8.3 常见面试问题准备这个问题时应该能够回答以下衍生问题如果冷却时间n非常大你的算法还高效吗是的仍然是O(N)时间因为公式计算是常数时间如果有成千上万种任务你的算法还适用吗是的因为我们只关心频率不关心具体任务种类如何证明你的算法能得到最优解可以通过反证法如果存在更优解必然能插入更多任务到冷却间隔中但这与最高频任务的定义矛盾9. 学习资源与进阶练习9.1 推荐学习资源要深入理解这类调度问题我推荐以下资源《算法导论》中的贪心算法章节LeetCode上的类似问题Rearrange String k Distance ApartReorganize StringGeeksforGeeks上的任务调度文章9.2 进阶练习题为了巩固对这个问题的理解可以尝试解决以下变种问题每个任务可能有不同的执行时间冷却时间可能根据前一个任务而变化考虑多核CPU的情况任务之间有依赖关系的情况9.3 实际问题应用尝试将这个算法应用到实际问题中设计一个课程表安排系统考虑课程之间的时间间隔安排工厂生产线考虑机器冷却时间设计电梯调度算法考虑电梯的方向切换延迟10. 个人经验与心得分享在实际解决这个问题的过程中我总结了一些个人经验不要一开始就尝试写代码先在小例子上手动模拟寻找问题中的限制条件和关键因素这里是最高频任务推导数学公式时考虑所有可能的边界情况测试用例要覆盖各种特殊情况特别是频率分布均匀的情况在面试中即使不能立即想到最优解也可以先提出暴力解法再逐步优化我最初解决这个问题时花了很长时间才理解为什么公式能工作。后来通过绘制多个例子的时间线才真正明白了其中的规律。这告诉我对于算法问题有时候直观的理解比数学推导更重要。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑