线段树解决729我的日程安排表I
发布日期:2021-06-29 12:29:22 浏览次数:2 分类:技术文章

本文共 1755 字,大约阅读时间需要 5 分钟。

这个题主要是学习线段树的使用:

 

class MyCalendar {    // 线段树的根    private SegmentTreeNode root;    /**     * 线段树结构体     */    private static class SegmentTreeNode {        int start;// 时间开始区间        int end;// 时间结束区间        SegmentTreeNode left;// 区间左孩子        SegmentTreeNode right;// 区间右孩子        SegmentTreeNode(int start,int end){            this.start = start;            this.end = end;        }    }    public MyCalendar() {        root = new SegmentTreeNode(0,0);    }    public boolean book(int start, int end) {        return updateSegment(root,start,end);    }    /**     * 更新线段树节点     * @param root 线段树节点     * @param start 新插入的开始时间     * @param end 新插入的结束时间     * @return 是否合法     */    private boolean updateSegment(SegmentTreeNode root,int start,int end){        // 新节点,要么只能全在node.start往左,要么只能全在node.end往右        SegmentTreeNode node = root;        while (true){            // 因为start,end是前闭后开区间,所以end可以取等号            if (end <= node.start){                // 左子树为空,表示可以添加                if (node.left == null){                    node.left = new SegmentTreeNode(start,end);                    return true;                }                // 进入左子树线段树                node = node.left;            }else if (start >= node.end){                // 右子树为空,表示可以添加                if (node.right == null){                    node.right = new SegmentTreeNode(start, end);                    return true;                }                // 进入右子树的线段树                node = node.right;            }else {                // start或end在[node.start,node.end)中,产生了重复预定                return false;            }        }    }}/** * Your MyCalendar object will be instantiated and called as such: * MyCalendar obj = new MyCalendar(); * boolean param_1 = obj.book(start,end); */

 

转载地址:https://bupt-xbz.blog.csdn.net/article/details/112557066 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux 文件系统
下一篇:并查集求婴儿名字

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月18日 07时05分47秒