732. My Calendar III

这题也是暴力解是Sweep line + TreeMap
每次把booking 拆成两个events直接丢进去。然后遍历一遍treeMap得出k就好了
时间复杂度O(N^2)
731的第一种做法在这里不是很合适了,因为要建最多k个二维数组,所以那个做法这里就不写了。
另外一种做法就是Augmented BST. 这题也是很直接吧。731里面TreeNode里面有一个boolean量叫overlap,这里面就设一个 int 变量 overlap就好了。每次update的时候traverse down每条路更新节点的overlap并更新global最大值。
先看暴力解

class MyCalendarThree {
    TreeMap treeMap;

    public MyCalendarThree() {
        treeMap = new TreeMap<>();
    }
    
    public int book(int start, int end) {
        treeMap.put(start, treeMap.getOrDefault(start, 0) + 1);
        treeMap.put(end, treeMap.getOrDefault(end, 0) - 1);
        int sum = 0;
        int ans = 0;
        for (int d : treeMap.values()) {
            sum += d;
            ans = Math.max(ans, sum);
        }
        return ans;
    }
}

下面看一下Augmented BST的写法,感觉也挺好。
长是长了点,不过都是套路。
我出了一个bug,就是在进入下一层的时候就这句,
如果start == b的话,那说明start在root.start 里面 , 这时root.start比start可能要大。 所以这里应该比较的是start 和root.start,而不是start和b这种不伦不类的比较

if (start <= root.start) { 
        //我在这里出了一个bug,我把条件写成了 start <= b wrong
            root.left = insert(root.left, a, b, rep);
        } else {
            root.left = insert(root.left, a, b, root.count);
        }
class MyCalendarThree {
    TreeNode root;
    int globalMax;
    public MyCalendarThree() {
        root = null;
        globalMax = 0;
    }
    
    public int book(int start, int end) {
        root = insert(root, start, end, 1);
        return globalMax;
    }
    private TreeNode insert(TreeNode root, int start, int end, int rep) {
        if (start >= end) {
            
            return root;
        }
        if (root == null) {
            globalMax = Math.max(rep, globalMax);
            //globalMax = Math.max(globalMax, root.count);
            return new TreeNode(start, end, rep);
        } 
       
        if (root.end <= start) {
            root.right = insert(root.right, start, end, rep);
            globalMax = Math.max(globalMax, root.count);
            return root;
        }
        if (root.start >= end) {
            root.left = insert(root.left, start, end, rep);
            globalMax = Math.max(globalMax, root.count);
            return root;
        }
        int a = Math.min(start, root.start);
        int b = Math.max(start, root.start);
        int c = Math.min(end, root.end);
        int d = Math.max(end, root.end);
        if (start <= root.start) { 
        //我在这里出了一个bug,我把条件写成了 start <= b wrong
            root.left = insert(root.left, a, b, rep);
        } else {
            root.left = insert(root.left, a, b, root.count);
        }
        if (end >= root.end) {
            root.right = insert(root.right, c, d, rep);
        } else {
            root.right = insert(root.right, c, d, root.count);
        }
        
        root.start = b;
        root.end = c;
        
        if(b < c) root.count += rep;
        globalMax = Math.max(globalMax, root.count);
        return root;
    }
}

class TreeNode{
    int start, end, count;
    TreeNode left, right;
    TreeNode(int start, int end, int count) {
        this.start = start;
        this.end = end;
        this.count = count;
    }
}

Segment Tree 的解法,我看讨论区大家都用Segment tree + Lazy propagation, 是时候学一下这个技巧了。 等我很快补上这个解法。

你可能感兴趣的:(732. My Calendar III)