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. spark rdd map java_如何在spark RDD(JavaRDD)中获取记录的文件名
  2. c++学习笔记之运算符的重载
  3. 二鸟在林不如一鸟在手
  4. threejs引擎中 环境光线与管道流动
  5. React传递参数的多种方式
  6. 如何从SharePoint Content DB中查询List数据
  7. Hadoop的eclipse1.1.2插件的安装和配置
  8. 'C'is not a valid file-based resource name character: File-based resource names must contain onl解决方法
  9. 激光雷达科普(1):激光雷达的分类及重要参数
  10. python大众点评霸王餐_划重点:如何报名大众点评霸王餐?怎么做才能中奖?
  11. 2021年北京人大附中高考成绩查询,2021北京市地区高考成绩排名查询,北京市高考各高中成绩喜报榜单...
  12. input range: vue自定义进度条
  13. 计算机图形处理的一些知识
  14. 达梦培训总结及心得体会
  15. 2023年安徽省职业院校“磐云杯”网络安全竞赛任务书
  16. 【python】录音语音识别
  17. kali Linux命令大全
  18. 神器Overleaf!
  19. java小组坦克大战游戏开发文档开发日志_java实现坦克大战游戏
  20. 龙芯软件开发(10)--龙芯2E指令

热门文章

  1. Arduino 读取 DS18B20 通过315/433 收发温度
  2. ICPC2017网络赛(南宁)子序列最大权值(树状数组+dp)
  3. HTTP里的MIME 什么是MIME?
  4. 3D制图软件如何进行多CAD混合设计?
  5. 「01」机器学习,到底在学些什么?
  6. python编程用笔记本电脑推荐_编程用的笔记本推荐
  7. VS2017 .NET C# MDI窗体菜单,隐藏子窗体ICON图标
  8. OPC通用报表软件(General_reports)
  9. Yagi-Uda八木天线
  10. 基于硬件快照技术来辅助嵌入式系统安全测试