首页 > 试题广场 >

参加会议的最大数目

[编程题]参加会议的最大数目
  • 热度指数:1075 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个闭区间列表 meetings ,其中 ,表示会议 开始, 结束,你可以在这个区间的任意一天中参加这个会议,但是你一天只能参加一个会议。
请你算出你最多可以参加多少个会议。

数据范围:区间列表长度满足 ,区间中的值满足
示例1

输入

[[1,2],[2,3],[4,5]]

输出

3

说明

可以在第一天参加第一个会议,第二天参加第二个会议,第四天参加第三个会议 
示例2

输入

[[1,2],[2,3],[2,3]]

输出

3

说明

可以在第一天参加第一个会议,第二天参加第二个会议,第三天参加第三个会议 
会议开始时间大于结束时间代表的是什么意思呀?这里为什么不能只关心会议的结束时间,排序后卡着会议的最后一天参加会议呢?
发表于 2022-04-14 11:32:14 回复(1)
# -*- coding: utf-8 -*-

import heapq


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param meetings int整型二维数组
# @return int整型
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/4d3151698e33454f98bce1284e553651?tpId=196&tqId=40523&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=3&tags=&title=
    参考:
        https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/solution/zui-duo-ke-yi-can-jia-de-hui-yi-shu-mu-by-leetcode/
        大神:老汤
    算法:
        本题使用贪心的策略:
            对于开始时间相同的会议,我们优先选择结束时间较早的会议先参加,这样才能保证参加更多的会议。比如会议列表为[[1, 1][1, 2], [1, 3], [1, 4]],参加顺序为[1,1] -> [1,2] -> [1,3] -> [1,4],这样恰好能在4天时间参加4个会议,达到最大化。
        1. 对于会议列表按开始时间进行升序排序
        2. 使用curDay表示当前是哪一天,使用小顶堆维护会议的结束时间,从第1天开始,我们将meetings[i][0] == curDay的会议时间,加入小顶堆。
        3. 将小顶堆中结束时间小于curDay的会议删除,这些会议都是过期的,无法参见了。
        4. 如果小顶堆不空,弹出堆顶元素,可参加会议数+1
        5. curDay += 1
    复杂度:
        时间复杂度:O(nlogn)
        空间复杂度:O(n)
    """

    def attendmeetings(self, meetings):
        # write code here
        meetings.sort(key=lambda x: x[0])
        print meetings

        n = len(meetings)
        res, i, curDay, minHeap = 0, 0, 1, []
        while i < n&nbs***bsp;minHeap:
            while i < n and meetings[i][0] == curDay:  # 将所有开始时间等于curDay的会议结束时间加入minHeap
                heapq.heappush(minHeap, meetings[i][1])
                i += 1

            while minHeap and minHeap[0] < curDay:  # 将所有结束时间小于curDay的过期会议删除
                heapq.heappop(minHeap)

            if minHeap:  # 选择结束时间最早的会议进行参加
                heapq.heappop(minHeap)
                res += 1

            curDay += 1  # 日期+1

        return res


if __name__ == "__main__":
    sol = Solution()

    # matrix = [[1, 2], [2, 3], [4, 5]]

    # matrix = [[1, 2], [2, 3], [2, 3]]

    # matrix = [[5, 9], [16, 8], [6, 40], [17, 50], [13, 19], [15, 7], [21, 32], [10, 3], [1, 2], [27, 18]]

    matrix = [[8, 22], [16, 6], [5, 10], [20, 3], [12, 2], [18, 1], [36, 41], [17, 19], [46, 15], [38, 48], [25, 45],
              [35, 9]]

    res = sol.attendmeetings(matrix)

    print res

发表于 2022-06-26 19:32:16 回复(0)
此题目有问题,这个实际上用贪心解法,根据结束时间排序,然后后面会议的开始时间大于等于前面的结束时间,就累加;本题测试用例绝壁有问题
发表于 2022-11-16 16:15:04 回复(0)
垃圾题目,开始时间大于结束时间是啥玩意
发表于 2022-06-22 20:18:36 回复(2)

问题信息

难度:
4条回答 1698浏览

热门推荐

通过挑战的用户

查看代码