leetcode:253. 至少需要多少间会议室

题目来源

题目描述

在这里插入图片描述

题目解析

最小堆

分析:

  • 这里一定要把所有会议全部安排完,所以一定需要遍历这些数组
  • 首先,一堆会议时间是杂乱无章的,为了让其有序,我们可以将其排序,那么问题是以起始时间排序还是以终止时间排序?
  • 思考,这道题我们要解决的问题是:当观察到一个会议时,需不需要另外安排会议室?
  • 从这个思路来看,我们考虑的顺序是按照会议开始的时间,因此这里按照会议起始的时间来排序
  • 排序后遇到的另一个问题是,当一个新会议开始的时候,我们要怎么确定这个时候是否有之前空出来的会议室
  • 因此我们还要对会议的结束时间进行统计,每当一个会议开始,我们就去检查这个会议之前开始的会议的结束时间的最小值。所以我们可以维护一个最小堆用于记录结束时间。

小结:

  • 先按照开始时间对这些数组进行排序
  • 然后准备一个最小堆,这个最小堆维护的是当前会议之前开始的会议的结束时间。怎么维护呢?
int minMeetingRooms(std::vector<std::vector<int>>intervals){
    if(intervals.empty()){
        return 0;
    }



    std::sort(intervals.begin(), intervals.end(), [](std::vector<int> &l, std::vector<int> &r){
        return l[0] < r[0];
    });

    std::priority_queue<int, std::vector<int>, std::greater<>> pq;
    // 第一个会议肯定是需要排序的
    pq.emplace(intervals[0][1]);
    for (int i = 1; i < intervals.size(); ++i) {
        // 有一个会议室空出来了
        if(intervals[i][0] >= pq.top()){  // 如果当前会议start >= 之前的end
            pq.pop();  // 把之前的房间空出来
        }
        pq.emplace(intervals[i][1]);
    }



    return pq.size();
}


类似题目

题目思路
leetcode:56. 将所有重叠的区间合并到一个区间里面 Merge Intervals先按照起始位置排序,然后判断区间是否重叠(start[i] < end) ,如果不重叠,那么压入一个新的区间,否则更新右边界
Leetcode:252. 一个人是否能参见完所有的会议 meeting-rooms 本质是判断是否存在重叠区间:将区间按照会议开始时间升序排序;遍历会议,如果下一个会议在前一个会议结束之前就开始了,返回 false。
leetcode:253. 至少需要多少间会议室 Meeting Rooms最小堆:先按照开始时间对这些数组进行排序,然后准备一个最小堆,这个最小堆维护的是当前会议之前开始的会议的结束时间。
leetcode:1136. 修完全部课程至少需要几个学期和上面不同的是,会议室一定不会形成环,而这可能会形成环。所以253题用最小堆来做,而1136必须拓扑排序
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时复杂度为O(n^2),空复杂度为O(1)。 思路2:哈希表 为了优化时复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时复杂度为O(n),空复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时复杂度为O(nlogn),空复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空使用,则暴力法是最简单的方法。如果数组较大或者需要优化时复杂度,则哈希表或双指针方法更合适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值