我的日程安排表 III

二解答 (有序结合的思想,实际可以运用线段树解决能减少不少代码)

var treeNode = function(left=null,right=null,start,end) {
    this.left = left;
    this.right = right;
    this.start = start;
    this.end = end; 
    this.k = 1;
}

var MyCalendarThree = function() {
    //有序集合
    this.ck = 0;
    this.maxK = 0;
    this.root = null;
};

/** 
 * @param {number} start 
 * @param {number} end
 * @return {number}
 */

var insert = function(node,start,end) {
    let t_k = 0;
    if(start >= node.end) {
        if(node.right != null) {
            t_k = Math.max(t_k,insert(node.right, start, end));
        } else {
            let no = new treeNode(null,null,start,end);
            no.k = 1; t_k = Math.max(t_k, no.k);
            node.right = no;
        }
    } else if(end <= node.start) {
        if(node.left != null) {
            t_k = Math.max(t_k,insert(node.left, start, end));
        } else {
            let no = new treeNode(null,null,start,end);
            no.k = 1; t_k = Math.max(t_k, no.k);
            node.left = no;
        }
    } else if(start >= node.start && end <= node.end) {
        if(start - node.start > 0) {
            let new_left = new treeNode(null,null,node.start,start);
            new_left.k = node.k;
            new_left.left = node.left;
            node.left = new_left;
        }
        if(node.end - end > 0) {
            let new_right = new treeNode(null,null,end,node.end);
            new_right.k = node.k;
            new_right.right = node.right;
            node.right = new_right;
        }
        node.start = start;node.end = end;
        t_k = Math.max(t_k,++node.k);
    } else if(start < node.start && (end > node.start && end <= node.end)) {
        let l_start = start; let l_end = node.start;
        if(node.end - end > 0) {
            let new_r_node = new treeNode(null,null,end,node.end);
            new_r_node.right = node.right; new_r_node.k = node.k; node.right = new_r_node;
        }
        node.end = end;t_k = Math.max(t_k,++node.k);
        t_k = Math.max(t_k,insert(node,l_start,l_end));
    } else if(start >= node.start && start < node.end && end > node.end) {
        let r_start = node.end; let r_end = end;
        if(start - node.start > 0) {
            let new_l_node = new treeNode(null,null,node.start, start);
            new_l_node.left = node.left; new_l_node.k = node.k; node.left = new_l_node;
        }
        node.start = start; t_k = Math.max(t_k, ++node.k);
        t_k = Math.max(t_k, insert(node,r_start, r_end));
    } else if(start < node.start && end > node.end) {
        t_k = Math.max(t_k, ++node.k);
        let l_start = start; let l_end = node.start;
        let r_start = node.end; let r_end = end;
        t_k = Math.max(t_k, insert(node,l_start,l_end));
        t_k = Math.max(t_k, insert(node,r_start,r_end));
    }
    return t_k;
}

MyCalendarThree.prototype.book = function(start, end) {
    if(this.root == null) {
        this.root = new treeNode(null,null,start, end);
        this.maxK = this.root.k = 1;
    } else {
        this.maxK = Math.max(this.maxK, insert(this.root,start,end));
    }

    return this.maxK;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值