File tree Expand file tree Collapse file tree 5 files changed +177
-0
lines changed
find-median-from-data-stream
kth-smallest-element-in-a-bst
lowest-common-ancestor-of-a-binary-search-tree Expand file tree Collapse file tree 5 files changed +177
-0
lines changed Original file line number Diff line number Diff line change 1+ class MedianFinder {
2+ private left : PriorityQueue < number > ;
3+ private right : PriorityQueue < number > ;
4+
5+ constructor ( ) {
6+ this . left = new PriorityQueue < number > ( ( a , b ) => b - a ) ; // 최대 힙
7+ this . right = new PriorityQueue < number > ( ( a , b ) => a - b ) ; // 최소 힙
8+ }
9+
10+ addNum ( num : number ) : void {
11+ if ( this . left . isEmpty ( ) || num <= this . left . front ( ) ) {
12+ this . left . enqueue ( num ) ;
13+ } else {
14+ this . right . enqueue ( num ) ;
15+ }
16+
17+ if ( this . left . size ( ) > this . right . size ( ) + 1 ) {
18+ this . right . enqueue ( this . left . dequeue ( ) ) ;
19+ }
20+
21+ if ( this . right . size ( ) > this . left . size ( ) ) {
22+ this . left . enqueue ( this . right . dequeue ( ) ) ;
23+ }
24+
25+ if ( ! this . right . isEmpty ( ) && this . left . front ( ) > this . right . front ( ) ) {
26+ const maxValue = this . left . dequeue ( ) ;
27+
28+ this . right . enqueue ( maxValue ) ;
29+ }
30+ }
31+
32+ findMedian ( ) : number {
33+ let result = 0 ;
34+
35+ if ( this . left . size ( ) === this . right . size ( ) ) {
36+ result = ( this . left . front ( ) + this . right . front ( ) ) / 2 ;
37+ } else if ( this . left . size ( ) === this . right . size ( ) + 1 ) {
38+ result = this . left . front ( ) ;
39+ }
40+
41+ return result ;
42+ }
43+ }
44+
45+ /**
46+ * Your MedianFinder object will be instantiated and called as such:
47+ * var obj = new MedianFinder()
48+ * obj.addNum(num)
49+ * var param_2 = obj.findMedian()
50+ */
Original file line number Diff line number Diff line change 1+ // Time Complexity: O(n)
2+ // Space Complexity: O(n)
3+ function insert ( intervals : number [ ] [ ] , newInterval : number [ ] ) : number [ ] [ ] {
4+ const result : number [ ] [ ] = [ ] ;
5+ let merged = newInterval ;
6+ let i = 0 ;
7+
8+ while ( i < intervals . length && intervals [ i ] [ 1 ] < merged [ 0 ] ) {
9+ result . push ( intervals [ i ++ ] ) ;
10+ }
11+
12+ while ( i < intervals . length && intervals [ i ] [ 0 ] <= merged [ 1 ] ) {
13+ merged [ 0 ] = Math . min ( merged [ 0 ] , intervals [ i ] [ 0 ] ) ;
14+ merged [ 1 ] = Math . max ( merged [ 1 ] , intervals [ i ] [ 1 ] ) ;
15+ i ++ ;
16+ }
17+ result . push ( merged ) ;
18+
19+ while ( i < intervals . length && intervals [ i ] [ 0 ] > merged [ 1 ] ) {
20+ result . push ( intervals [ i ++ ] ) ;
21+ }
22+
23+ return result ;
24+ }
Original file line number Diff line number Diff line change 1+ /**
2+ * Definition for a binary tree node.
3+ * class TreeNode {
4+ * val: number
5+ * left: TreeNode | null
6+ * right: TreeNode | null
7+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8+ * this.val = (val===undefined ? 0 : val)
9+ * this.left = (left===undefined ? null : left)
10+ * this.right = (right===undefined ? null : right)
11+ * }
12+ * }
13+ */
14+
15+ // Time Complexity: O(k) - 최악의 경우 모든 노드를 방문하면 O(n)
16+ // Space Complexity: O(h) - 재귀 호출 스택의 최대 깊이 (h는 트리의 높이)
17+ function kthSmallest ( root : TreeNode | null , k : number ) : number {
18+ let count = 0 ;
19+ let result = 0 ;
20+
21+ const inorder = ( node : TreeNode | null ) : void => {
22+ if ( ! node ) return ;
23+
24+ inorder ( node . left ) ;
25+
26+ count ++ ;
27+ if ( count === k ) {
28+ result = node . val ;
29+ return ;
30+ }
31+
32+ inorder ( node . right ) ;
33+ } ;
34+
35+ inorder ( root ) ;
36+
37+ return result ;
38+ }
Original file line number Diff line number Diff line change 1+ /**
2+ * Definition for a binary tree node.
3+ * class TreeNode {
4+ * val: number
5+ * left: TreeNode | null
6+ * right: TreeNode | null
7+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8+ * this.val = (val===undefined ? 0 : val)
9+ * this.left = (left===undefined ? null : left)
10+ * this.right = (right===undefined ? null : right)
11+ * }
12+ * }
13+ *
14+ * Time Complexity: O(logn) in average, O(n) in the worst case
15+ * Space Complexity: O(logn) in average, O(n) in the worst case
16+ */
17+ function lowestCommonAncestor ( root : TreeNode | null , p : TreeNode | null , q : TreeNode | null ) : TreeNode | null {
18+ if ( p . val < root . val && q . val < root . val ) {
19+ return lowestCommonAncestor ( root . left , p , q ) ;
20+ } else if ( p . val > root . val && q . val > root . val ) {
21+ return lowestCommonAncestor ( root . right , p , q ) ;
22+ }
23+
24+ return root ;
25+ }
Original file line number Diff line number Diff line change 1+ import { Interval } from "../home/lib/index" ;
2+ /**
3+ * Definition of Interval:
4+ * export class Interval {
5+ * start :number;
6+ * end :number;
7+ * constructor(start :number, end :number) {
8+ * this.start = start;
9+ * this.end = end;
10+ * }
11+ * }
12+ */
13+
14+ export class Solution {
15+ /**
16+ * Time Complexity: O(nlogn)
17+ * Space Complexity: O(1)
18+ *
19+ * @param intervals: an array of meeting time intervals
20+ * @return : if a person could attend all meetings
21+ */
22+ canAttendMeetings ( intervals : Interval [ ] ) : boolean {
23+ if ( intervals . length <= 1 ) return true ;
24+
25+ intervals . sort ( ( a , b ) => a . start - b . start ) ;
26+
27+ let prevEnd = intervals [ 0 ] . end ;
28+ for ( let i = 1 ; i < intervals . length ; i ++ ) {
29+ const currentStart = intervals [ i ] . start ;
30+ const currentEnd = intervals [ i ] . end ;
31+
32+ if ( prevEnd > currentStart ) {
33+ return false ;
34+ }
35+ prevEnd = currentEnd ;
36+ }
37+
38+ return true ;
39+ }
40+ }
You can’t perform that action at this time.
0 commit comments