解题思路
采用用的比较多的统计词频的做法。先对char数组中的字频进行统计,然后排序。
比如AAABBCC这种串且n=2,可以使A _ _ A _ _ A _ _,然后把BC分别插进去。
网上有很多讨论一组空格可以直接放进去的博客,次数就不说了。着重记录一下以下情况
如
(1)AAABBCCDDEE,n=2;
(2)或者AABBCC,n=1(这种是maxCnt>n的情况)
即由最大词频空出的格子无法将剩余的字母全部放入,这种情况下的最短调度时间应该就是字符串(char数组)长度。
这也是代码中当使用公式计算出来的值小于字符串长度的情况,
即 tasks.length>(times[25]-1)*(n+1)+25-i 时
贴一个别人的说法,感觉很贴切,可以从优先队列的角度(或者是贪心也行),每次都选取最多的那个
代码如下
class Solution {
public int leastInterval(char[] tasks, int n) {
int[] times = new int[26];
for(char ch : tasks)
times[ch-'A']++;
Arrays.sort(times);
int i = 25;
while(i>=0 && times[i]==times[25])
i--;
return Math.max(tasks.length,(times[25]-1)*(n+1)+25-i);
}
}