Leetocode之Task Scheduler 问题

问题描述:

Given a char array representing tasks CPU need to do. It contains capital letters A to Z where different letters represent different tasks.Tasks could be done without original order. Each task could be done in one interval. For each interval, CPU could finish one task or just be idle.

However, there is a non-negative cooling interval n that means between two same tasks, there must be at least n intervals that CPU are doing different tasks or just be idle.

You need to return the least number of intervals the CPU will take to finish all the given tasks.

Note:

  1. The number of tasks is in the range [1, 10000].
  2. The integer n is in the range [0, 100].

示例:

Input: tasks = ['A','A','A','B','B','B'], n = 2
Output: 8
Explanation: A -> B -> idle -> A -> B -> idle -> A -> B.

思路分析:先介绍下题目的意思,然后我们在举几个例子,最后总结下规律给出代码。

题目意思:

       数组中的字母表示的是CPU要执行的任务,相同的字母表示相同的任务,但是相同的任务之间必须间隔n个位置(interval,OS中翻译成时间片好像更准确一些吧),每个位置要么是CPU执行一个任务,要么就是idle,其中任务的完成顺序可以不是题目中数组的给定顺序。最后求的是CPU完成这些任务至少需要需要多少个位置(interval)。

案例分析:

       例子一:上面的AAABBB,n = 2,我们可以这么构造,先找出数组中字母最多的字母,先让它站好坑,由于n=2,所以相同任务至少间隔2,在这AB是同样多的,所以构造的时候将它两绑定在一块成AB _ AB _AB,没有其他字母了,所以剩下两个空位填上idle,最终的长度是8 = (3 - 1) * (2 + 1) + 2;

      例子二:比如AACCCDDEEE,n = 3,最多的是C,所以我们可以C_ _ _ C_ _ _ C_ _ _,接着放第二多的E,可以是CE_ _ CE_ _ CE _ _,接着放A,就是CEA_CEA_CE_ _,接着就是放D了,得到最后结果CEADCEADCE(当然不是唯一结果),但是长度是唯一的,长度 = tasks.length = 10.

规律总结:

我们可以先申请一个长度为26的数组,用来统计每个字母出现的次数,接着对数组进行排序,找到出现次数最多的字母,所以出现最多的字母一定是出现在了统计数组的最后,它出现的次数记为maxCount;另外,我们先考虑前面的每一块,后面剩下的先不说了,即例子一的AB_这一部分,每一块的长度为1 + n,为什么是n + 1呢?1代表着这个数本身,接着至少间隔n个元素才能出现该元素,加一块就是n + 1了;每一块共出现了maxCount - 1次(还剩一次出现在尾巴),所以就是(maxCount - 1) * (n + 1);接着我们计算尾巴的长度,我们可以启动一个遍历过程,在计数数组中从后往前找,找到第一个不等于最大次数maxCount的位置,尾巴长都不就是25 - i了吗?所以,总共长度len就是(maxCount - 1) * (n + 1) + (25 - i)。当然还有可能是数组长度就够了,就能安排好每个任务了,所以结果是max(tasks.length, len)了。

代码:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值