我的日程安排表 III

tobegold574 Lv5

我的日程安排表 III🟨

做题过程

用线段树写起来很麻烦,就差分很快写完了,在能不能剪枝上卡了一下,后面还是没有剪枝,好像不能剪枝。

算法概述

原题

本题要求为每次加入预定区间后返回预定区间最大重叠次数。差分太简单了,还是以线段树为准。

  • 时间复杂度为
  • 空间复杂度为

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class MyCalendarThree {
// II用了一个值为数组的哈希表,其实同理
private Map<Integer, Integer> tree;
private Map<Integer, Integer> lazy;

public MyCalendarThree() {
tree = new HashMap<Integer, Integer>();
lazy = new HashMap<Integer, Integer>();
}

public int book(int start, int end) {
update(start, end - 1, 0, 1000000000, 1);
return tree.getOrDefault(1, 0);
}

public void update(int start, int end, int l, int r, int idx) {
if (r < start || end < l) {
return;
}
if (start <= l && r <= end) {
tree.put(idx, tree.getOrDefault(idx, 0) + 1);
lazy.put(idx, lazy.getOrDefault(idx, 0) + 1);
} else {
int mid = (l + r) >> 1;
update(start, end, l, mid, 2 * idx);
update(start, end, mid + 1, r, 2 * idx + 1);
// 和II一样的,还是子树中的最大标记次数和当前节点自身的标记次数
tree.put(idx, lazy.getOrDefault(idx, 0) + Math.max(tree.getOrDefault(2 * idx, 0), tree.getOrDefault(2 * idx + 1, 0)));
}
}
}

总结

线段树思路回顾我的日程安排表 II

  • Title: 我的日程安排表 III
  • Author: tobegold574
  • Created at : 2025-01-04 10:08:17
  • Updated at : 2025-01-04 10:27:27
  • Link: https://tobegold574.me/2025/01/04/我的日程安排表-III/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments