leetcode253.会议室 II「差分」

目录

1.题目描述

2.解题思路

3.代码实现

2021/10/26回顾

代码实现

高效版


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「差分」_第1张图片

参考:力扣

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>& intervals) {
        map 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021/10/26回顾

差分数组解题思路

leetcode253.会议室 II「差分」_第2张图片

代码实现

class Solution:
    def corpFlightBookings(self, bookings: List[List[int]], n: int) -> List[int]:
        diff = [0 for _ in range(n+2)]
        for book in bookings:
            diff[book[0]] += book[2]
            diff[book[1]+1] -= book[2]
        sum_= 0
        res = []
        for d in diff[1:-1]:
            sum_ += d
            res.append(sum_)
        return res

高效版

class Solution:
    def minMeetingRooms(self, intervals: List[List[int]]) -> int:
        if not intervals:
            return 0
        # 优化存储,dict代替list
        diff = collections.defaultdict(int)

        for interval in intervals:
            diff[interval[0]] += 1
            diff[interval[1]] -= 1
        sum_= 0
        res = 0
        # 代替对list求前缀和
        diff = sorted(diff.items(), key= lambda item: item[0])
        for k,v in diff:
            sum_ += v
            res = max(res,sum_)
        return res

你可能感兴趣的:(leetcode,可信,leetcode)