Leetcode 759. Employee Free Time

思路:區域覆蓋問題。一個天然的想法是將每一個員工的工做時間段看作一個木棒,每一個木棒的長度就是這個時間段的時長。而後按照木棒的起始位置升序排列,接着由低位置向高位置一個木棒一個木棒的看過去。若是當前木棒的末節點的位置>下一個木棒的頭節點位置,那麼這兩個節點就是一個free time的開頭和結尾;若是當前木棒的末節點位置<=下一個木棒的頭節點位置,那麼更新當前木棒的末節點位置爲max(當前木棒的末節點位置,下一個木棒的頭節點位置)。spa

 1 /**
 2  * Definition for an interval.
 3  * public class Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() { start = 0; end = 0; }
 7  *     Interval(int s, int e) { start = s; end = e; }
 8  * }
 9  */
10 class Solution {
11     public List<Interval> employeeFreeTime(List<List<Interval>> schedule) {
12         List<Interval> res = new ArrayList<>();
13         PriorityQueue<Interval> pq = new PriorityQueue<>((a,b)->a.start - b.start);//按照第一個元素升序排列
14         schedule.forEach(e->pq.addAll(e));//lamdba表達式,將schedule的每一個元素的每一個子元素加入pq中
15         Interval before = pq.poll();
16         while(!pq.isEmpty()) {
17             if(before.end < pq.peek().start) {
18                 res.add(new Interval(before.end, pq.peek().start));
19                 before = pq.poll();
20             }else{
21                 before = before.end < pq.peek().end ? pq.peek() : before;//這裏不能寫成before = before.end < pq.peek().end ? pq.poll() : before;會Time Limit Exceeded
22                 pq.poll();
23             }
24         }
25         return res;
26     }
27 }
相關文章
相關標籤/搜索