855. 考场就座
  1Hh2sdYQZd4C 2023年11月02日 95 0


849. 到最近的人的最大距离

class Solution {
    public int maxDistToClosest(int[] seats) {
        int i = 0, n = seats.length, j = n - 1;
        while (seats[i] == 0) i++;
        int res = i;
        while (seats[j] == 0) j--;
        res = Math.max(res, n - j - 1);
        for (int k = i + 1; k <= j; k++) {
            if (seats[k] == 1) {
                res = Math.max(res, (k - i) / 2);
                i = k;
            }
        }
        return res;
    }
}

855. 考场就座

class ExamRoom {
    int n;
    TreeSet<Integer> s = new TreeSet(); // 入座的座位号
    // 获取最大区间,优先左侧
    PriorityQueue<int[]> q = new PriorityQueue<int[]>((a, b) -> {
            int x = (a[1] - a[0]) / 2, y = (b[1] - b[0]) / 2;
            return x == y ? a[0] - b[0] : y - x;
            //return x < y || (x == y && a[0] > b[0]) ? 1 : -1;
        });

    public ExamRoom(int n) {
        this.n = n;
    }

    public int seat() {
        if (s.isEmpty()) {
            s.add(0);
            return 0;
        }
        // 延迟删除无效区间
        while (!q.isEmpty() && (!s.contains(q.peek()[0]) || !s.contains(q.peek()[1]) || s.higher(q.peek()[0]) != q.peek()[1])) {
            q.poll();
        }
        int p = 0, left = s.first(), right = n - 1 - s.last();
        if(!q.isEmpty()){
            int[] t = q.peek();
            // 向上取整
            int d = (t[1] - t[0]) / 2;
            if(d > left && d >= right){
                p = t[0] + d;
                q.offer(new int[]{t[0], p});
                q.offer(new int[]{p, t[1]});
                s.add(p);
                return p;
            }            
        }        
        if (right > left) { // 最右的位置更优
            p = n - 1;
            q.offer(new int[]{s.last(), p});
        } else {
            q.offer(new int[]{0, s.first()});
        }
        s.add(p);
        return p;
    }

    public void leave(int p) {
        // 不是两端填加区间
        if (p != s.first() && p != s.last()) {
            q.offer(new int[]{s.lower(p), s.higher(p)});
        }
        s.remove(p);
    }
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读