[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.

For example,
Given [[0, 30],[5, 10],[15, 20]],
return 2.

思路

基本思路都是扫描线算法,有几个不同的实现版本:

1、一维向量:将整个intervals映射到一个一维向量中,并且用一个int值来标记是会议的开始还是结束(用0表示会议结束,用1表示会议开始,这样在同一时间算法会首先处理会议结束的情况),然后对这个一维向量中的数据进行排序。最后扫描一维向量,一旦发现某个会议结束,则会议室用量减1,否则加1。同时更新一下全局最大办公室用量。整个算法的空间复杂度是O(n),时间复杂度是O(nlogn)。

2、multiset:这次是先对每个区间的起点排序,然后依次将每个区间的终点放在一个集合中。如果下一个区间的起点大于等于之前某个区间的终点,就将其从集合中删除,每次需要统计一下当前所需的最大办公室数量。这个版本的时间复杂度还是O(nlogn),但是空间复杂度却变成output-dependent的了,最多是O(n),最少是O(1)。

3、map:我们用一个map来存储重合区域,即每个区间的起点代表一个区间的开始,会将重叠区域+1,每个区间的结束点代表一个区间的结束,会将重叠区域-1。因此我们可以利用这个性质,结合STL中的map来实现(实质上这个算法和“一维向量”版本非常像,只是采用的数据结构不同而已)。

代码

1、一维向量:

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    int minMeetingRooms(vector& intervals) {
        vector> meetings;
        int max_room = 0, crt_room = 0;
        for(int i = 0; i < intervals.size(); ++i) {
            meetings.push_back(make_pair(intervals[i].start, 1));
            meetings.push_back(make_pair(intervals[i].end, 0));
        }
        sort(meetings.begin(), meetings.end());
        for(int i = 0; i < meetings.size(); ++i) {
            if(meetings[i].second == 0) {
                --crt_room;
            }
            else {
                ++crt_room;
            }
            max_room = max(max_room, crt_room);
        }
        return max_room;
    }
};
2、multiset:

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    int minMeetingRooms(vector& intervals) {
        auto cmp = [](Interval a, Interval b) { return a.start < b.start; };
        sort(intervals.begin(), intervals.end(), cmp);
        multiset ms;
        int max_room = 0;
        for (auto val : intervals) {
            while (!ms.empty() && val.start >= *ms.begin()) {
                ms.erase(ms.begin());
            }
            ms.insert(val.end);
            max_room = max(max_room, static_cast(ms.size()));
        }
        return max_room;
    }
};
3、Map:

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    int minMeetingRooms(vector& intervals) {
        map mp;
        for (auto val : intervals) {
            ++mp[val.start];
            --mp[val.end];
        }
        int max_room = 0, crt_room = 0;
        for (auto val : mp) {
            crt_room += val.second;
            max_room = max(max_room, crt_room);
        }
        return max_room;
    }
};

你可能感兴趣的:(IT公司面试习题)