Skip to content

Commit 86fb8c6

Browse files
authored
Create 1353-maximum-number-of-events-that-can-be-attended.js
1 parent b80c50c commit 86fb8c6

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* @param {number[][]} events
3+
* @return {number}
4+
*/
5+
function maxEvents(events) {
6+
events.sort(([, aEnd], [, bEnd]) => aEnd - bEnd);
7+
const lastDay = events[events.length - 1][1];
8+
const segmentTree = new SegmentTree(Array.from({ length: lastDay }, (_, i) => i), Infinity, (a, b) => Math.min(a, b));
9+
let daysAttended = 0;
10+
11+
for (const [start, end] of events) {
12+
// earliest attendable day
13+
const ead = segmentTree.queryIn(start - 1, end);
14+
if (ead <= end) {
15+
daysAttended += 1;
16+
segmentTree.setAt(ead, Infinity);
17+
}
18+
}
19+
20+
return daysAttended;
21+
}
22+
23+
// https://github.com/axross/complex-data-structures
24+
// new SegmentTree(values, identity, associate)
25+
// segmentTree.getAt(i)
26+
// segmentTree.queryIn(from, to)
27+
// segmentTree.setAt(i, value)
28+
// segmentTree.length
29+
class SegmentTree{constructor(t,e,s){if(this.valueLength=t.length,this.identity=e,this.associate=s,0===t.length)this.tree=[];else{const h=2**Math.ceil(Math.log2(t.length))*2-1,i=[];for(let s=0;s<=h>>1;++s)i[(h>>1)+s]=s<t.length?t[s]:e;for(let t=(h>>1)-1;t>=0;--t)i[t]=s(i[2*t+1],i[2*t+2]);this.tree=i}}get length(){return this.valueLength}getAt(t){return this.tree[t+(this.tree.length>>1)]}queryIn(t,e){let s=this.identity;const h=[[0,0,1+(this.tree.length>>1)]];for(;h.length>0;){const[i,r,n]=h.pop();r>=t&&n<=e?s=this.associate(s,this.tree[i]):r>=e||n<t||i>this.tree.length>>1||h.push([2*i+1,r,r+n>>1],[2*i+2,r+n>>1,n])}return s}setAt(t,e){const s=t+(this.tree.length>>1);this.tree[s]=e;let h=s-1>>1;for(;h>=0;)this.tree[h]=this.associate(this.tree[2*h+1],this.tree[2*h+2]),h=h-1>>1}}

0 commit comments

Comments
 (0)