zoukankan      html  css  js  c++  java
  • [LeetCode] 253. Meeting Rooms II

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required.

    Example 1:

    Input: [[0, 30],[5, 10],[15, 20]]
    Output: 2

    Example 2:

    Input: [[7,10],[2,4]]
    Output: 1

    NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

    会议室二。

    版本一问的是一个人是否有可能参与所有的会议,版本二问的是给一堆会议的起止时间,问需要多少个会议室。

    两种思路,我这里分享一个官方题解,有图示帮助理解。第一种是把每个会议的开始时间和结束时间拎出来分别排序,再遍历intervals。遍历的时候,设置一个pointer = 0,判断当前interval[i]的开始时间是否大于前一个会议的结束时间interval[pointer][end]。如果大于,就说明不需要新开一个会议室;如果小于,就需要新开一个会议室。因为题目只在意需要同时开几个会议室,所以start和end可以分别排序。end只要结束一个,就意味着同时需要的会议室就少一个。

    时间O(nlogn) - 因为有对input排序

    空间O(n) - 有用额外数组对start和end排序

    JavaScript实现

     1 /**
     2  * @param {number[][]} intervals
     3  * @return {number}
     4  */
     5 var minMeetingRooms = function(intervals) {
     6     let start = [];
     7     let end = [];
     8     let len = intervals.length;
     9     for (let i = 0; i < len; i++) {
    10         let cur = intervals[i];
    11         start.push(cur[0]);
    12         end.push(cur[1]);
    13     }
    14     start = start.sort((a, b) => a - b);
    15     end = end.sort((a, b) => a - b);
    16     let res = 0;
    17     let pointer = 0;
    18     for (let i = 0; i < len; i++) {
    19         if (start[i] < end[pointer]) {
    20             res++;
    21         } else {
    22             pointer++;
    23         }
    24     }
    25     return res;
    26 };

    Java实现

     1 class Solution {
     2     public int minMeetingRooms(int[][] intervals) {
     3         // corner case
     4         if (intervals == null || intervals.length == 0) {
     5             return 0;
     6         }
     7         // normal case
     8         int len = intervals.length;
     9         int[] start = new int[len];
    10         int[] end = new int[len];
    11         for (int i = 0; i < len; i++) {
    12             start[i] = intervals[i][0];
    13             end[i] = intervals[i][1];
    14         }
    15         Arrays.sort(start);
    16         Arrays.sort(end);
    17         int res = 0;
    18         int pointer = 0;
    19         for (int i = 0; i < len; i++) {
    20             if (start[i] < end[pointer]) {
    21                 res++;
    22             } else {
    23                 pointer++;
    24             }
    25         }
    26         return res;
    27     }
    28 }

    [Java only] 第二种思路

    先对intervals按开始时间排序,再用一个最小堆存放每个interval的结束时间,并加入第一个interval,此时堆顶是第一个interval的结束时间。遍历intervals,判断当前interval的开始时间(A)跟堆顶interval的结束时间(B),若A >= B则说明两个interval没有overlap,extend堆顶interval的结束时间;若A < B则将当前interval放入堆中。

    时间O(nlogn),其中排序O(nlogn),heap的各项操作O(logn)

    空间O(n)

     1 class Solution {
     2     public int minMeetingRooms(int[][] intervals) {
     3         // corner case
     4         if (intervals == null || intervals.length == 0) {
     5             return 0;
     6         }
     7 
     8         // normal case
     9         Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
    10         // sort by ending time
    11         PriorityQueue<int[]> heap = new PriorityQueue<>(intervals.length, (a, b) -> a[1] - b[1]);
    12         heap.offer(intervals[0]);
    13         for (int i = 1; i < intervals.length; i++) {
    14             int[] now = heap.poll();
    15             if (intervals[i][0] >= now[1]) {
    16                 now[1] = intervals[i][1];
    17             } else {
    18                 heap.offer(intervals[i]);
    19             }
    20             heap.offer(now);
    21         }
    22         return heap.size();
    23     }
    24 }

    扫描线相关题目

    LeetCode 题目总结

  • 相关阅读:
    [VirtaulBox]网络连接设置
    LeetCode
    LeetCode
    LeetCode
    LeetCode-37.Sudok Solver
    LeetCode-36.Valid Sudoku
    LeetCode-52.N-Queen II
    LeetCode-51.N-Queens
    LeetCode-22.Generate Parentheses
    LeetCode-111.Mininum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/cnoodle/p/11774859.html
Copyright © 2011-2022 走看看