621. Task Scheduler

这题刚开始还是有点难的。
我刚开始想用贪心法,发现各种test case过不了。
后来看答案才学习到这种做法。
这应该是一种很常见做法吧。
就是做完一个任务把这个任务更新一下timeStamp,等这个timeStamp 到了,就又可以处理了。Web Crawler上经常用这种做法。
然后还有一点就是如果有多个任务同时available,
那我们优先处理剩得最多的。

我在这题里悟到了一点。
为了避免出bug
在写code之前最好列提纲
每一步写code之前写好注释。
这样可以避免很多bug。

class Solution {
    public int leastInterval(char[] tasks, int n) {
        //build HashMap to take count 
        Map map = new HashMap<>();
        for (char c : tasks) map.put(c, map.getOrDefault(c, 0) + 1 );
        //build Queue and Heap;
        Queue maxHeap = new PriorityQueue<>(new Comparator(){
            public int compare(Task o1, Task o2) {
                return o2.count - o1.count;
            }
        });
        Queue waitingQueue = new LinkedList<>();
        // generate the task and put to heap;
        for (Map.Entry entry : map.entrySet()) {
            maxHeap.offer(new Task(entry.getKey(), entry.getValue()));
        }
        
        // simulate the process
        int time = 0;
        while (!maxHeap.isEmpty() || !waitingQueue.isEmpty()) {
            //check the waitingQueue and put to heap
            while (!waitingQueue.isEmpty() && waitingQueue.peek().timeStamp + n < time) {
                maxHeap.offer(waitingQueue.poll());
            }
            
            //poll from heap if can
            if(!maxHeap.isEmpty()){
                Task t = maxHeap.poll();
                t.count--;
                t.timeStamp = time;
                if (t.count > 0) waitingQueue.offer(t);
            }
            
            time ++;
        }
        
        //return the result;
        return time;
        
    }
}
class Task {
    char id;
    int count;
    int timeStamp;
    public Task(char id, int count) {
        this.id = id;
        this.count = count;
    }
}

你可能感兴趣的:(621. Task Scheduler)