一.题目

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

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

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

二.示例

输入:["ExamRoom","seat","seat","seat","seat","leave","seat"], [[10],[],[],[],[],[4],[]]
输出:[null,0,9,4,2,null,5]
解释:
ExamRoom(10) -> null
seat() -> 0,没有人在考场里,那么学生坐在 0 号座位上。
seat() -> 9,学生最后坐在 9 号座位上。
seat() -> 4,学生最后坐在 4 号座位上。
seat() -> 2,学生最后坐在 2 号座位上。
leave(4) -> null
seat() -> 5,学生最后坐在 5 号座位上。

三.题目分析

这道题简单说就是在一个有序数组中,遍历计算相邻两个位置之间的间隔距离(两个座位号的差值),找出最大的间隔距离,而最大间隔距离的两个数的中点就是我们要找的位置,将该中点的索引值插入到该位置即可。因此需要一下几步:

第一步:保证每次判断时数组的有序性(这里使用TreeSet实现)保证了集合中数据的有序性和唯一性。

第二步:设置两个指针(prev和cur),两个指针总是指向相邻的两个位置,便于计算两个位置的距离,计算完可以同时后移。

第三步:找出数组中距离(两个数据差值)最大的位置(此时prev和cur指向这两个位置),即可计算出中间位置的索引((prev + cur)>> 1),采用位运算的原因是效率高。

第四步:判断特殊情况:

1.如果该数组为空,那么0号座位就是第一位考生的座位,即add(index == 0)。

2.因为Treeset是变长的,而教室的座位固定的,如果此时最大号的座位是null,遍历数组的时候就无法计算到最大号座位与数组最后一个元素之间的距离,因此最后还要判断最大号座位和数组最后一个元素(即最后一个座位到前一个有考生的座位的距离)之间的距离,如果大于前面已有考生的两个座位之间的最大距离,那么就执行add(index == 教室的最后一个座位)

第五步:在该位置插入当前位置的索引add(index),返回index。

四.Java实现

class ExamRoom {private TreeSet<Integer> room;private int size;public ExamRoom(int N) {this.room = new TreeSet<>();this.size = N - 1;}public int seat() {int index = 0;if (room.size() > 0){int dist = room.first();// 第一次遍历时还有没有pre,因此距离为0.Integer prev = null;for (Integer cur: room){// 遍历考场中的全部座位if (prev != null){int d = (cur - prev) >> 1;// 获取当前位置和上一个位置的距离if (d > dist){// 替换最大距离和对应的位置下标dist = d;index = (cur + prev) >> 1;}}prev = cur;// 前一个位置后移到当前位置}if (size - room.last() > dist){index = size;// 最后一个位置的判断}}room.add(index);return index;}public void leave(int p) {room.remove(p);}
}

leetCode-考场就座相关推荐

  1. LeetCode 考场就座

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

  2. LeetCode——考场就座

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

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

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

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

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

  5. LeetCode 855. 考场就座

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

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

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

  7. 855. 考场就座(高频题)

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

  8. Leetcode 855:考场就座

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

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

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

  10. 【LeetCode - 855】考场就座

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

最新文章

  1. GridSearchCV 与 RandomizedSearchCV 调参
  2. golang switch case语句 简介
  3. elasticsearch 5.x Delete By Query API(根据条件删除)
  4. JavaScript 表单编程
  5. 什么叫优雅降级和渐进增强
  6. DES加密解密与AES加密解密
  7. 【主题演讲】探讨视频行业与技术的更多挑战与机会
  8. SAP 电商云 Spartacus UI ROUTING_FEATURE 的使用场景
  9. redis nosql_NoSql数据库:Cassandra,Mongo,Redis数据库比较
  10. php文件上传前端页面样式,HTML实现美化上传文件样式
  11. 实际操作更改Linux启动模式
  12. MATLAB的7种滤波方法(重制版)
  13. Django序列化器
  14. 计算机保研面试中,都有哪些令人窒息的问题?
  15. 基于遥感影像的变化检测数据集
  16. CDH的安装详细步骤
  17. 百慕大将于下周宣布推出加密货币友好银行
  18. ant编译错误:不再支持源选项 1.5,请使用 1.6 或更高版本。
  19. 磁盘管理:磁盘调度算法
  20. java6程序设计实践教程_Java 6 程序设计实践教程

热门文章

  1. 闪客工具:ghostcat
  2. 7个等级 容灾等级_高可用性及容灾的几个衡量指标
  3. MySQL拼接函数使用介绍
  4. Vue—keepAlive 动态管理页面缓存
  5. NS3系列—2———NS3笔录
  6. vmwareplayer
  7. RPA 实际操作Excel数据
  8. 【python OCR】PaddleOCR简单demo入门
  9. 【双曲几何学 02】什么是极点和极线?
  10. 【职场和发展】职业期望是指一个人对某种职业的渴求和向往