欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode253.会议室 II

程序员文章站 2022-06-03 09:57:17
...

1.题目描述

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。

示例 1:

输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:

输入: [[7,10],[2,4]]
输出: 1

2.解题思路

分别保存起始时间和结束时间,然后各自排个序,定义结果变量 res 和结束时间指针 j,然后开始遍历,如果当前起始时间小于结束时间指针的时间,则结果自增1,反之结束时间指针自增1,这样可以找出重叠的时间段,从而安排新的会议室

每遇到一个会议安排A,A的开始时间要与已有会议室的最早结束时间比较。如果A的开始时间 大于等于 已有会议室的最早结束时间时无需新增会议室。因为到时后,这个会议室一定是空的。

leetcode253.会议室 II

参考:https://leetcode-cn.com/problems/meeting-rooms-ii/solution/hui-yi-shi-ii-by-leetcode/

3.代码实现

class Solution(object):
    def minMeetingRooms(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """

        if not intervals:
            return 0
        used_rooms = 0
        start_timings = sorted([i[0] for i in intervals])
        end_timings = sorted(i[1] for i in intervals)
        L = len(intervals)
        j = 0
        for i in range(L):
            if start_timings[i] < end_timings[j]:
                used_rooms+=1
            else:
                j+=1
        return used_rooms

 

附上另一种解题方法,C++版本

class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        map<int, int> m;
        for(auto& v: intervals) m[v[0]]++, m[v[1]]--;
        int ans = 0, res = 0;
        # 按照key值从小到大排序,如果相同,则value值小的排在前面
        # 例如(10,-1) 放在 (10,1)前面
        for(auto& it: m) {
            ans += it.second;
            res = max(res, ans);
        }
        return res;
    }
};

作者:trsteel
链接:https://leetcode-cn.com/problems/meeting-rooms-ii/solution/xian-duan-shu-qu-jian-geng-xin-dan-dian-qiu-zhi-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。