LeetCode 1353. 最多可以参加的会议数目(排序+贪心,优先队列,难)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1353. 最多可以参加的会议数目(排序+贪心,优先队列,难)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 錯誤解
- 2.2 超時解
- 2.3 通過解
- 2.4 大佬解
1. 題目
給你一個數組 events,其中 events[i] = [startDayi, endDayi] ,表示會議 i 開始于 startDayi ,結束于 endDayi 。
你可以在滿足 startDayi <= d <= endDayi 中的任意一天 d 參加會議 i 。注意,一天只能參加一個會議。
請你返回你可以參加的 最大 會議數目。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be-attended
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
2.1 錯誤解
- 先按會議的start排序,相同的話按照end排序
根據出錯的例子,可知上面算法有缺陷:
正確的應該是:
- 對當前會議i,還需要往下找到j,j 被包含在i的區間內
- 如果attendTime與區間j有交點,優先先參加j
2.2 超時解
class Solution {//超時代碼 public:int maxEvents(vector<vector<int>>& events) {sort(events.begin(), events.end(),[](vector<int>& a, vector<int>& b){if(a[0] == b[0])return a[1] < b[1];return a[0] < b[0];});int i, j, count = 0, attendTime = 0;for(i = 0; i < events.size(); ++i){if(attendTime < events[i][0]){attendTime = events[i][0];count++;attendTime++;}else if(attendTime <= events[i][1]){for(j = i+1; j < events.size() && events[i][1] <= events[j][1]; ++j);if(j < events.size() && attendTime >= events[j][0]){count++;events.erase(events.begin()+j);attendTime++;i--;continue;}count++;attendTime++;}}return count;} };不幸的是:最后一個例子超時
2.3 通過解
優化
- 當attendTime與events[j]沒有交點時,提前break
2.4 大佬解
大佬的思路
- 按照會議start對 events 升序排序
- 按日期time進行掃描
- 將time時開始的會議都加入到優先隊列(隊列存儲的是會議結束end時間)
- 優先隊列(小頂堆)把結束日期早的先出隊,參加該會議
- time++,新的一天,先把優先隊列里已經過期的會議刪除
總結
以上是生活随笔為你收集整理的LeetCode 1353. 最多可以参加的会议数目(排序+贪心,优先队列,难)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 594. 最长和谐子序
- 下一篇: LeetCode 646. 最长数对链(