
二解答 (有序结合的思想,实际可以运用线段树解决能减少不少代码)
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;
};