【路飞】算法与数据结构-最多可以参加的会议数目

132 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。

你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。

请你返回你可以参加的 最大 会议数目。

示例 1:

输入:events = [[1,2],[2,3],[3,4]]
输出:3
解释:你可以参加所有的三个会议。
安排会议的一种方案如上图。
第 1 天参加第一个会议。
第 2 天参加第二个会议。
第 3 天参加第三个会议。

示例 2:

输入: events= [[1,2],[2,3],[3,4],[1,2]]
输出: 4

思路

贪心算法

  • 把所有会议按照结束时间排序,我们优先参加早结束的会议
  • 由于一天只能参加一个会议,所以使用一个 哈希(数组也可以) 记录我们使用过的天
  • 参加每一个会议时,优先使用比较早的天来参加
/**
 * @param {number[][]} events
 * @return {number}
 */

var maxEvents = function(events) {
  let count = 0, had = [];
  
  events.sort((a, b) => a[1] - b[1]);
  
  for (let i = 0, len = events.length; i < len; i++) {
    let [start, end] = events[i];
    for (let j = start; j <= end; j++) {
      if (had[j] === undefined) {
        had[j] = 1;
        count++;
        break;
      }
    }
  }
  
  return count;
};