LeetCode 621 : 任务调度器 【贪心算法】

本文深入探讨了任务调度器算法的实现,特别是针对CPU执行任务列表的问题,提出了有效的解决方案。通过示例说明如何在考虑冷却时间的情况下,计算完成所有任务所需的最短时间,采用贪心算法思路进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

621. 任务调度器

难度中等256

给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。

然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的最短时间

示例 :

输入:tasks = ["A","A","A","B","B","B"], n = 2
输出:8
解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
     在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。 

提示:

  1. 任务的总个数为 [1, 10000]
  2. n 的取值范围为 [0, 100]

思路

这里采用贪心算法思路:
比如 给定的 任务[A:3, B:2, C:1] n = 2
那么可以 A->B->C  ->A->B->(等待)->A :结果 time:7
如果使用 A->B->(等待)->A 所以 可以进行按轮次安排任务, 也即是 每轮 是 n+1 个任务。 不够的话就进入空闲等待了。

比如这样[A:4,B:2,C:2,D:1,E:1] n = 2, 那么按上面的来 每轮安排 n+1 个任务 也就是 3 个任务
第一轮: A->B->C  走完之后的情况:[A:3,B:1,D:1,E:1]
第二轮: A->B->D  走完之后的情况:[A:2,E:1]
第三轮: A->E->(等待)  走完之后的情况:[A:1]
第四轮: A        走完之后的情况:[]
总共时间:10

代码

import java.util.*;
class Solution {
    public int leastInterval(char[] tasks, int n) {
        // 这题带给我的理解 就是 很多时候不用去记录 比如 ABC 不用记录 ABC 给他们排序保存, 只需要 用过 或者使用 计数器这些东西足够
        /*
            [A,A,A,A,B,B,C]  -> [A:3, B:2,C:1] -> [0.....,1,2,3]  n=2 的情况,然后使用每次的 n + 1 个任务 比如 A B C 这时候再执行 A 正好不需要冷却。 如果是 A B (等待) A 就需要冷却
        */
        int [] map = new int[26];
        // 将 task 字符转入 map 中存储
        for(char c:tasks)
            map[c - 'A']++;   // 转换使用数字存储 
        // 然后定义一个数字 记录全局时间。
        int time = 0;
        Arrays.sort(map);  // 排序 [0.....1,2,3]

        while(map[25] > 0){
            int i = 0; // 记录 n 的轮次 是否满足了
            while(i<=n){ // 这里 要 <= n 这样 才能 n+1 轮次 
                // 首先要判断下 最大轮次是否已经走完
                if(map[25] == 0)
                    break;
                if(i < 26 && map[25 - i] > 0 )
                    map[25 - i]--;  // 走轮次
                time++;
                i++;
            }
            Arrays.sort(map);  // 再重新排序 看是否最大的已经走完 [A:3,B:3,C:2]  A 可能会先走完
        }

         return time;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值