力扣刷题:17-任务调度器(621)

160 阅读1分钟

要想以最快的时间完成任务,每次应该先执行需要冷却时间最长的任务,在任务的冷却期间,执行其他冷却时间最长的任务。

下面是C++语言实现的代码,本例中使用了迭代器模式,每次消费一个任务,直到所有任务消费完毕。

class Task {
public:
    char type;
    int count;
    int running;
    Task(char _type) {
        type = _type;
        count = 1;
        running = 0;
    }
};

class TaskList {
private:
    map<char, Task> taskMap;
    int n;
public:
    TaskList(int _n) {
        n = _n;
    }

    void produce(char type) {
        map<char, Task>::iterator iter = taskMap.find(type);
        if (iter != taskMap.end()) {
            iter->second.count++;
        } else {
            taskMap.insert(pair<char, Task>(type, Task(type)));
        }
    }

    bool hasTask() {
        return !taskMap.empty();
    }

    char consume() {
        Task *max = nullptr;
        for (auto iter = taskMap.begin(); iter != taskMap.end(); iter++) {
            if (iter->second.running == 0 && (!max || iter->second.count > max->count)) {
                max = &(iter->second);
            }
            if (iter->second.running > 0) {
                iter->second.running--;
            }
        }
        if (max) {
            max->count--;
            max->running = n;
            char type = max->type;
            if (max->count == 0) {
                taskMap.erase(max->type);
            }
            return type;
        }
        return ' ';
    }

    void display() {
        map<char, Task>::iterator iter;
        for (iter = taskMap.begin(); iter != taskMap.end(); iter ++) {
            cout << iter->first << iter->second.count << endl;
        }
    }
};

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        TaskList taskList(n);
        for (auto task : tasks) {
            taskList.produce(task);
        }
        int count = 0;
        while (taskList.hasTask()) {
            // cout << taskList.consume() << endl;
            taskList.consume();
            count++;
        }
        // taskList.display();
        return count;
    }
};