TaskCooldown

题目地址:https://instant.1point3acres.com/thread/195147


题目:
Task那道题,很多面经都提到过。就是比如给你一串task,再给一个cooldown,执行每个task需要时间1,两个相同task之间必须至少相距cooldown的时间,问执行所有task总共需要多少时间。比如执行如下task:12323,假设cooldown是3。总共需要的时间应该是 1 2 3 _ _ 2 3,也就是7个单位的时间。再比如 1242353,假设cool down是4,那总共时间就是 1 2 4 _ _ _ 2 3 5 _ _ _ 3,也就是13个单位的时间

解题思路:
首先定义两个变量:time和prev_time。第一个表示当前任务执行的时间,第二个表示该任务之前出现的时间。这道题需要用一个map来存储之前出现的时间。只有当time <= prev_time + cooldown + 1 的时候才需要更新time。之后把char和更新后的time放到map里面就好。


代码:
public static int min_time(int[] tasks, int interval){
    if(tasks == null || tasks.length == 0){
        return 0;
    }
    Map map = new HashMap();
    int time = 0;
    for(int task : tasks){
        Integer task_last_time = (Integer) map.get(task);
        if(task_last_time != null && task_last_time + interval + 1 > time){
            time = task_last_time + interval + 1;
        }
        map.put(task, time);
        time++;
    }
    return time;
}
public static void main(String[] args){
    int[] tasks1 = {1, 2,3,2,3};
    System.out.println(min_time(tasks1, 3));

    int[] tasks2 = {1, 2, 4, 2, 3, 5, 3};
    System.out.println(min_time(tasks2, 4));
}

另外一种思路:
map存的是task with id [i] 下一个可以进行的index。(更好理解)

代码:

public class TaskCooldown {

    public int schedule(int[] tasks, int cooldown){
        if(tasks == null || tasks.length == 0){
            return 0;
        }
        if(tasks.length == 1){
            return 1;
        }
        int rst = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i <= tasks.length - 1; i++){
            if(!map.containsKey(tasks[i])){
                rst += 1;
                map.put(tasks[i], rst + cooldown + 1);
            }
            else{
                int available = map.get(tasks[i]);
                rst += 1;
                if(rst >= available){
                    // could fill int position rst                    map.put(tasks[i], rst + cooldown + 1);
                }
                else{
                    rst = available;
                    map.put(tasks[i], rst + cooldown + 1);
                }
            }
        }
        return rst;
    }

    public static void main(String[] args){
        TaskCooldown taskCooldown = new TaskCooldown();
        int[] tasks1 = {1, 1, 2, 1};
        int[] tasks2 = {1, 2, 1, 1};
        int rst1 = taskCooldown.schedule(tasks1, 2);
        int rst2 = taskCooldown.schedule(tasks2, 2);
        System.out.println(rst1);
        System.out.println(rst2);
    }

}




Comments

Popular Posts