855. 考场就座

  • 题目
  • 解题思路
  • 代码

题目

在考场里,一排有 N 个座位,分别编号为 0, 1, 2, …, N-1 。

当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有人,那么学生就坐在 0 号座位上。)

返回 ExamRoom(int N) 类,它有两个公开的函数:其中,函数 ExamRoom.seat() 会返回一个 int (整型数据),代表学生坐的位置;函数 ExamRoom.leave(int p) 代表坐在座位 p 上的学生现在离开了考场。每次调用 ExamRoom.leave§ 时都保证有学生坐在座位 p 上。

解题思路

见书P389

代码

    class ExamRoom {private Map<Integer, int[]> startMap;private Map<Integer, int[]> endMap;private TreeSet<int[]> pq;private int N;/*** 构造函数,传入座位总数N** @param N*/public ExamRoom(int N) {this.N = N;startMap = new HashMap<>();endMap = new HashMap<>();pq = new TreeSet<int[]>((a, b) -> {//算出两个线段的长度int disA = distance(a);int disB = distance(b);//如果长度相同就比较索引if (disA == disB) {return b[0] - a[0];}return disA - disB;});//在有序集合中先放一个虚拟线段addInterval(new int[]{-1, N});}/*** 来一名考生,返回你给他分配的座位** @return*/public int seat() {// 从有序集合中取出最长的线段int[] longest = pq.last();int x = longest[0];int y = longest[1];int seat;if (x == -1) {seat = 0;} else if (y == N) {seat = N - 1;} else {seat = (y - x) / 2 + x;}// 将最长的线段分成两段int[] left = new int[]{x, seat};int[] right = new int[]{seat, y};removeInterval(longest);addInterval(left);addInterval(right);return seat;}/*** 坐在p位置的考生离开了** @param p*/public void leave(int p) {// 将p为左右的线段找出来int[] right = startMap.get(p);int[] left = endMap.get(p);// 合并两个线段成为一个int[] merged = new int[]{left[0], right[1]};removeInterval(left);removeInterval(right);addInterval(merged);}/*一些需要用到的API*///去除线段private void removeInterval(int[] intv) {pq.remove(intv);startMap.remove(intv[0]);endMap.remove(intv[1]);}//        增加线段private void addInterval(int[] intv) {pq.add(intv);startMap.put(intv[0], intv);endMap.put(intv[1], intv);}//        计算线段的长度private int distance(int[] intv) {int x = intv[0];int y = intv[1];if (x == -1) {return y;}if (y == N) {return N - x - 1;}//中点和端点之间的长度return (y - x) / 2;}}/*** Your ExamRoom object will be instantiated and called as such:* ExamRoom obj = new ExamRoom(N);* int param_1 = obj.seat();* obj.leave(p);*/

855. 考场就座(高频题)相关推荐

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

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

  2. LeetCode 855. 考场就座

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

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

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

  4. 【855. 考场就座】

    来源:力扣(LeetCode) 描述: 在考场里,一排有 N 个座位,分别编号为 0, 1, 2, ..., N-1 . 当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上 ...

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

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

  6. 面试高频题:Spring和SpringMvc父子容器你能说清楚吗

    引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...

  7. Java 面试高频题:Spring Boot+Sentinel+Nacos高并发已撸完

    2021都说工作不好找,也是对开发人员的要求变高.前段时间自己有整理了一些Java后端开发面试常问的高频考点问题做成一份PDF文档(1000道高频题),同时也整理一些图文解析及笔记,今天在这免费分享给 ...

  8. 找二叉树中给定元素的的左孩子结点_LeetCode高频题:二叉树(五)

    我开了一个LeetCode会员,选择了一些高频率题目.这个系列是希望帮助大家每天花30分钟的题目了解面试高频题,让大家面试更加游刃有余. 本期我们讲解两道树的中等题.我们之前几期的推送一直在强调递归和 ...

  9. Java面试高频题:Spring Boot+JVM+Nacos高并发+高可用已撸完​

    2021都说工作不好找,也是对开发人员的要求变高.前段时间自己有整理了一些Java后端开发面试常问的高频考点问题做成一份PDF文档(1000道高频题),同时也整理一些图文解析及笔记,今天在这免费分享给 ...

最新文章

  1. USACO Section 1.5 Checker Challenge
  2. 提高android 运行效率,如何提高安卓手机运行速度 提高安卓手机运行速度方法
  3. LeetCode - Reverse Nodes in k-Group
  4. 联想618首战告捷,是战略潜力的释放还是最后的“狂欢”?
  5. chrome同步_如何在Chrome中打开或关闭同步
  6. sqlite数据库备份还原、导出导入
  7. 无维护地稳定运行了8 年的 Hyperic HQ
  8. php 写二维数组,php二维数组怎么写
  9. 科学计算机统计模式中中间数据输错怎么办,科学计算器在统计功能中如何清除以前不需要的数据?...
  10. 质性数据分析软件NVivo的安装选项和参数
  11. 让你两分钟明白什么是ERP
  12. Unity IOS包在IPhone出现闪退
  13. 五天学redhat系列之---文件系统管理
  14. 通过Swap函数交换两个变量的值
  15. boost yield fock介绍
  16. 怎样从《几何原本》到《独立宣言》?
  17. 合并多个.npy文件
  18. Windows内核开发初步
  19. 【Linux操作】使用zip 压缩命令打包程序为.zip压缩包并进行解压缩
  20. 容量法和库仑法的异同点_卡尔-费休容量法与库仑法的区别

热门文章

  1. 3dsmax 模型创建+原生贴图(多图)
  2. 论文记录:Decoupling GCN with DropGraph Module for Skeleton-Based Action Recognition
  3. 分析目前国内的内容管理系统重构工程机械站
  4. 英语语法结构思维导图
  5. JSON-handle插件使用-Chrome浏览器
  6. Ashampoo.UnInstaller.5.v5.00-TE
  7. 安全认证Kerberos的安装与操作
  8. ip广播系统服务器软件,【网络广播服务器软件IP网络广播软件数字广播软件】 - 太平洋安防网...
  9. vmwareplayer
  10. Java项目之银行系统