zoukankan      html  css  js  c++  java
  • FB面经prepare: task schedule II

    followup是tasks是无序的.
    一开始是有序的,比如说1, 1, 2, 1,一定要先执行第一个task1,然后等task1恢复,再执行第2个task1,再执行task2..... followup是无序的,就是不用按给的顺序执行,也就是可以先执行task1,然后task1还没恢复时,先执行task2, etc......

    正确的做法应该是统计每个task的frequency,然后每次选frequency最高并且可以执行的task执行。

    用maxHeap存每个task的剩余frequency

     1 package TaskSchedule;
     2 import java.util.*;
     3 
     4 public class Solution2 {
     5     public class Element {
     6         int val;
     7         int appr;
     8         public Element(int value) {
     9             this.val = value;
    10             this.appr = 1;
    11         }
    12     }
    13     
    14     public int schedule(int[] arr, int recover) {
    15         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    16         PriorityQueue<Element> queue = new PriorityQueue<Element>(11, new Comparator<Element>() {
    17             public int compare(Element e1, Element e2) {
    18                 return e2.appr-e1.appr;
    19             }
    20         });
    21         Element[] summary = new Element[10];
    22         for (int each : arr) {
    23             if (summary[each] == null) {
    24                 summary[each] = new Element(each);
    25             }
    26             else summary[each].appr++;
    27         }
    28         for (Element elem : summary) {
    29             if (elem != null)
    30                 queue.offer(elem);
    31         }
    32         
    33         
    34         
    35         
    36         int time = 0;
    37         LinkedList<Element> temp = new LinkedList<Element>();
    38         while (!queue.isEmpty() || !temp.isEmpty()) {
    39             if (!queue.isEmpty()) {
    40                 Element cur = queue.poll();
    41                 if (!map.containsKey(cur.val)) {
    42                     map.put(cur.val, time+recover+1);
    43                     cur.appr--;
    44                     if (cur.appr > 0) temp.offer(cur);
    45                     while (!temp.isEmpty()) {
    46                         queue.offer(temp.poll());
    47                     }
    48                     time++;
    49                 }
    50                 
    51                 else { //map contains cur.val
    52                     if (time >= map.get(cur.val)) { //time is feasible
    53                         map.put(cur.val, time+recover+1);
    54                         cur.appr--;
    55                         if (cur.appr > 0) temp.offer(cur);
    56                         while (!temp.isEmpty()) {
    57                             queue.offer(temp.poll());
    58                         }
    59                         time++;
    60                     }
    61                     else { //time is not feasible
    62                         temp.offer(cur);
    63                     }
    64                 }
    65             }
    66             
    67             else { //queue is empty, but temp is not empty
    68                 while (!temp.isEmpty()) {
    69                     queue.offer(temp.poll());
    70                 }
    71                 time++;
    72             }
    73         }
    74         return time;
    75     }
    76     
    77 
    78     /**
    79      * @param args
    80      */
    81     public static void main(String[] args) {
    82         // TODO Auto-generated method stub
    83         Solution2 sol = new Solution2();
    84         System.out.println(sol.schedule(new int[]{1, 1, 2, 2, 3, 3}, 2));
    85     }
    86 
    87 }
  • 相关阅读:
    e生保plus
    Exception analysis
    经验总结:5个应该避免的前端糟糕实践
    经验总结:应对中文输入法的字符串截断方案(带代码示例)
    这些年那些文
    fis入门-单文件编译之文件优化(optimize)
    《HTTP权威指南》读书笔记:缓存
    npm install —— 从一个简单例子,看本地安装与全局安装的区别
    chrome下的Grunt插件断点调试——基于node-inspector
    Yeoman的好基友:Grunt
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5120091.html
Copyright © 2011-2022 走看看