一行N个位置,两种操作。

seat: 每次每个同学坐在一个位置,要满足尽量离最近的同学最远,

leave(i), 第i个位置的人起来,保证第i的位置是有人的

sol:

将相邻的两个人化为一个区间,那么每次seat的位置,就是最远的区间的中点。需要处理边界问题,我们可以虚拟出-1和N两个点,初始化的时候插入(-1, N)这个区间,注意怎么计算区间的distance的。

至于怎么取出最大的distance的,可以使用优先队列来实现

时间复杂度:

seat: O(lgN)

leave: O(N)

public class ExamRoom {int N;PriorityQueue<Interval> pq;public ExamRoom(int N) {this.N = N;this.pq = new PriorityQueue<>((o1, o2) -> {if (o1.d != o2.d) return Integer.compare(o2.d, o1.d);return Integer.compare(o1.x, o2.x);});pq.add(new Interval(-1, N));}public int seat() {int s;Interval poll = pq.poll();if (poll.x == -1) s = 0;else if (poll.y == N) s = N - 1;else s = (poll.x + poll.y) / 2;pq.add(new Interval(poll.x, s));pq.add(new Interval(s, poll.y));return s;}public void leave(int p) {Interval s, e;s = e = null;ArrayList<Interval> intervals = new ArrayList<>(pq);for (Interval interval : intervals) {if (interval.y == p) s = interval;if (interval.x == p) e = interval;if (s != null && e != null) break;}pq.remove(s);pq.remove(e);pq.add(new Interval(s.x, e.y));}class Interval {int x, y, d;public Interval(int x, int y) {this.x = x;this.y = y;if (x == -1) d = y;else if (y == N) d = N - 1 - x;else d = (y - x) / 2;}}
}

Leetcode 855相关推荐

  1. Leetcode 855. Exam Room 考场就座:提供两种解法

    Leetcode 855. Exam Room 考场就座: 提供两种解法 855. Exam Room 考场就座(两种解法) 题目描述 示例: 解答1 代码1 解答2 代码2 855. Exam Ro ...

  2. LeetCode 855. 考场就座

    855. 考场就座 [有序集合]用TreeSet存已经选好的座位,每次遍历所有的座位,如果两个之间的差值比当前max大,那么更新max和最后落座的位置.需要特别注意特判一下开头和结尾,因为有leave ...

  3. Leetcode 855:考场就座

    题目描述 在考场里,一排有 N 个座位,分别编号为 0, 1, 2, ..., N-1 . 当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上.如果有多个这样的座位,他会坐 ...

  4. 【LeetCode - 855】考场就座

    文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路 初始化:定义一个 TreeSet 存储已经占有的座位号,该数据结构会自动从小到大排序: seat: 1)定义一个全局最优 ...

  5. LeetCode - OrderMap - 855.考场就座

    题目 855.考场就座 难度 中等 在考场里,一排有 N 个座位,分别编号为 0, 1, 2, -, N-1 . 当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上.如果有 ...

  6. LeetCode解析------855.考场就座

    题目: 在考场里,一排有 N 个座位,分别编号为 0, 1, 2, -, N-1 . 当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上.如果有多个这样的座位,他会坐在编号 ...

  7. JAVA程序设计:考场就座(LeetCode:855)

    在考场里,一排有 N 个座位,分别编号为 0, 1, 2, ..., N-1 . 当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上.如果有多个这样的座位,他会坐在编号最小 ...

  8. Acwing LeetCode 题目分类——配套基础课进阶课

    LeetCode 题目分类--配套基础课进阶课 1.基础 二分(满足一个条件的最值问题) LeetCode33 https://leetcode.com/problems/search-in-rota ...

  9. [LeetCode]135.Candy

    [题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...

最新文章

  1. Oracle:管理 date类型 interval 动态变化的分区:查询、删除
  2. python爬虫代码房-Python爬虫一步步抓取房产信息
  3. org.activiti.engine.ActivitiException: Couldn't deserialize object in variable 'application'
  4. 【JavaSE04】Java中循环语句for,while,do···while-练习
  5. CSS 编码中超级有用的工具集合
  6. 如何构建GFS分布式存储平台?理论+实操!
  7. Android中获取网络图片的三种方法
  8. 如何解析属性文件(properties)获取键值对的值?
  9. python做物联网控制_python实现NB-IoT模块远程控制
  10. php如何将mysql数据库中的admin字段赋值给session_转php中使用session_set_save_handler()函数把session保存到MySQL数据库实例...
  11. Linux磁盘读写速率测试
  12. http和https的区别与联系
  13. 为什么要用3个通道来表示法线?
  14. SQLite 时间函数
  15. 基于CNN的人脸相似度检测
  16. 倒计时 分秒 小程序 方法_微信小程序 倒计时
  17. HTML表格的单元格合并
  18. 基于Krpano的全景导游系统设计与实现(含word文档)
  19. macBook下将m4a转换成mp3
  20. HRBUST1313 火影忍者之~静音

热门文章

  1. 一文解决——linux免费安装typora
  2. python系列之(大家圣诞快乐)圣诞树
  3. 使用pygame开发游戏:合金弹头(1)
  4. 12306网络订票系统
  5. android 通过usb读取 U盘
  6. 【精华系列文章】如何成为架构师?
  7. java jstack 分析_jstack 分析一下java程序
  8. 今天,你的微信铃声是什么?
  9. tmux配置以及常用命令
  10. QQ空间迁移_【联想V3000笔记本去白名单之一bios分离】