• 只关注出现次数最多的字符,然后以此为基础, 摆出所有需要插空的空格,
    • 然后就只剩两种情况,比如出现次数一样最多的字符有2种, 那么所有任务 - 最后的2种,然后去插空(按顺序插),看能不能把所有空格都消耗完

    • 这是能消耗完的例子

    image.png
    image.png

    image.png
    image.png
    image.png
    image.png
    image.png
    所以总时间就是N

    • 接下来是不能消耗完的例子

    image.png
    image.png
    image.png
    image.png
    所以总时间就是N + 剩余的空格数

    1. public int leastInterval(char[] tasks, int free) {
    2. int[] count = new int[256];
    3. // 出现最多次的任务,到底是出现了几次?
    4. int maxCount = 0;
    5. for (char task : tasks) {
    6. count[task]++;
    7. maxCount = Math.max(maxCount, count[task]);
    8. }
    9. // 有多少种任务,都出现最多次
    10. int maxKinds = 0;
    11. for (int i = 0; i < 256; i++) {
    12. if (count[i] == maxCount) {
    13. maxKinds++;
    14. }
    15. }
    16. // 砍掉最后一组剩余的任务数
    17. int taskExceptionFinalTeam = tasks.length - maxKinds;
    18. int spaces = (free + 1) * (maxCount - 1);
    19. int restSpaces = Math.max(0, spaces - taskExceptionFinalTeam);
    20. return tasks.length + restSpaces;
    21. }