【LeetCode - 855】考场就座

1、题目描述

在这里插入图片描述

2、解题思路

初始化:定义一个 TreeSet 存储已经占有的座位号,该数据结构会自动从小到大排序;

seat:
1)定义一个全局最优位置pos;
2)每两两相间的已占座位号为一个区间,每一个区间都存在唯一的局部最优位置,即区间的中心位置。每一个局部最优位置都有一个“与离他最近的人之间的距离最大值”,即区间大小除以 2 取整;
3)找到“与离他最近的人之间的距离最大值”最大的局部左右位置即为全局最优位置。

leave:
直接数据结构调用remove方法,该数据结构会重新调整为从小到大排序。

3、解题代码

import java.util.TreeSet;

/**
 * @ProjectName: Practices
 * @Author: Meumax
 * @Description:
 * @CreateTime: 2021-09-26 18:04:12
 **/
class ExamRoom {
    int N;
    TreeSet<Integer> set;   // 存储已经使用的座位

    public ExamRoom(int N) {
        this.N = N;
        set = new TreeSet<Integer>();
    }

    public int seat() {
        int pos = 0;    // 全局最优位置
        if (set.size() > 0) {
            int distance = set.first(); // 两两已占座位的间距
            Integer pre = null;    // 上一个已占座位号
            for (Integer cur : set) {   // 遍历已占座位号
                if (pre != null) {
                    int d = (cur - pre) / 2;   // 局部最优位置
                    if (d > distance) { // 更新全局最优位置
                        distance = d;
                        pos = pre + d;
                    }
                }
                pre = cur;
            }
            if (N - 1 - set.last() > distance)
                pos = N - 1;
        }
        set.add(pos);
        return pos;
    }

    public void leave(int p) {
        set.remove(p);
    }
}

/**
 * Your ExamRoom object will be instantiated and called as such:
 * ExamRoom obj = new ExamRoom(n);
 * int param_1 = obj.seat();
 * obj.leave(p);
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值