File tree Expand file tree Collapse file tree 5 files changed +184
-0
lines changed
kth-smallest-element-in-a-bst
lowest-common-ancestor-of-a-binary-search-tree Expand file tree Collapse file tree 5 files changed +184
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ *@link https://leetcode.com/problems/insert-interval/description/
3
+ *
4
+ * 접근 방법 :
5
+ * - 새로운 interval을 기존 interval에 추가하고, 시작 지점 기준으로 오름차순 정렬
6
+ * - 현재 interval이 result의 마지막 interval과 겹치는 경우, 종료 지점 업데이트해서 병함
7
+ * - 겹치지 않으면, result 배열에 현재 interval 추가
8
+ *
9
+ * 시간복잡도 : O(nlogn)
10
+ * - n = intervals 개수
11
+ * - 오름차순으로 정렬
12
+ *
13
+ * 공간복잡도 : O(n)
14
+ * - n = 병합 후 result 배열에 담긴 인터벌의 개수
15
+ */
16
+ function insert ( intervals : number [ ] [ ] , newInterval : number [ ] ) : number [ ] [ ] {
17
+ const sortedIntervals = [ ...intervals , newInterval ] . sort (
18
+ ( a , b ) => a [ 0 ] - b [ 0 ]
19
+ ) ;
20
+ const result : number [ ] [ ] = [ sortedIntervals [ 0 ] ] ;
21
+
22
+ for ( let i = 1 ; i < sortedIntervals . length ; i ++ ) {
23
+ const lastInterval = result [ result . length - 1 ] ;
24
+ const currentInterval = sortedIntervals [ i ] ;
25
+
26
+ if ( currentInterval [ 0 ] <= lastInterval [ 1 ] ) {
27
+ lastInterval [ 1 ] = Math . max ( currentInterval [ 1 ] , lastInterval [ 1 ] ) ;
28
+ } else {
29
+ result . push ( currentInterval ) ;
30
+ }
31
+ }
32
+
33
+ return result ;
34
+ }
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
+ /**
16
+ *@link https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/
17
+ *
18
+ * 접근 방법 :
19
+ * - 작은 수대로 정렬해야 하니까 중위순회로 트리 순회
20
+ * - 왼쪽 모드 끝까지 방문 -> 중간 노드 -> 오른쪽 끝까지 방문 으로 진행
21
+ * - k번째 노드 체크하기 위해서 노드 방문할 때마다 count 업데이트
22
+ *
23
+ * 시간복잡도 : O(n)
24
+ * - n = 노드의 개수,
25
+ * - 최악의 경우 전체 트리 탐색
26
+ *
27
+ * 공간복잡도 : O(n)
28
+ * - 재귀 호출이 트리 깊이만큼 스택 쌓임.
29
+ * - 기울어진 트리의 경우 O(n)
30
+ */
31
+ function kthSmallest ( root : TreeNode | null , k : number ) : number {
32
+ let count = 0 ;
33
+ let result : number | null = null ;
34
+
35
+ const inOrderTraverse = ( node : TreeNode | null ) => {
36
+ if ( ! node ) return null ;
37
+
38
+ inOrderTraverse ( node . left ) ;
39
+
40
+ count ++ ;
41
+ if ( count === k ) {
42
+ result = node . val ;
43
+ return ;
44
+ }
45
+
46
+ inOrderTraverse ( node . right ) ;
47
+ } ;
48
+
49
+ inOrderTraverse ( root ) ;
50
+
51
+ return result ! ;
52
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ *@link https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
3
+ *
4
+ * 접근 방법 :
5
+ * - BST니까 p,q 노드를 root 노드와 비교해서 탐색 범위 좁히기
6
+ * - root.val보다 작은 경우 왼쪽 하위 트리 탐색
7
+ * - root.vale보다 큰 경우 오른쪽 하위 트리 탐색
8
+ * - 그 외의 경우는 값이 같으니까 root 노드 리턴
9
+ *
10
+ * 시간복잡도 : O(n)
11
+ * - 균형 잡힌 BST의 경우 O(logn)
12
+ * - 한쪽으로 치우친 트리의 경우 O(n)
13
+ *
14
+ * 공간복잡도 : O(n)
15
+ * - 재귀 호출 스택 크기가 트리 깊이에 비례
16
+ * - 균형 잡힌 BST의 경우 O(logn)
17
+ * - 한쪽으로 치우친 트리의 경우 O(n)
18
+ */
19
+ class TreeNode {
20
+ val : number ;
21
+ left : TreeNode | null ;
22
+ right : TreeNode | null ;
23
+ constructor ( val ?: number , left ?: TreeNode | null , right ?: TreeNode | null ) {
24
+ this . val = val === undefined ? 0 : val ;
25
+ this . left = left === undefined ? null : left ;
26
+ this . right = right === undefined ? null : right ;
27
+ }
28
+ }
29
+
30
+ function lowestCommonAncestor (
31
+ root : TreeNode | null ,
32
+ p : TreeNode | null ,
33
+ q : TreeNode | null
34
+ ) : TreeNode | null {
35
+ if ( ! root || ! p || ! q ) return null ;
36
+
37
+ if ( p . val < root . val && q . val < root . val )
38
+ return lowestCommonAncestor ( root . left , p , q ) ;
39
+ else if ( p . val > root . val && q . val > root . val )
40
+ return lowestCommonAncestor ( root . right , p , q ) ;
41
+ else return root ;
42
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ *@link https://leetcode.com/problems/meeting-rooms/description/
3
+ *
4
+ * 접근 방법 :
5
+ * - 미팅 시작 시간이 빠른 순으로 정렬
6
+ * - 현재 미팅 시작 시간이 이전 미팅 끝나는 시간보다 작으면 겹치는 것이므로 false 리턴
7
+ *
8
+ * 시간복잡도 : O(nlogn)
9
+ * - n = intervals의 길이, 정렬했으므로 O(nlogn)
10
+ *
11
+ * 공간복잡도 : O(1)
12
+ * - 고정된 변수만 사용
13
+ */
14
+
15
+ function canAttendMeetings ( intervals : number [ ] [ ] ) : boolean {
16
+ intervals . sort ( ( a , b ) => a [ 0 ] - b [ 0 ] ) ;
17
+
18
+ for ( let i = 1 ; i < intervals . length ; i ++ ) {
19
+ const previousMeetingTime = intervals [ i - 1 ] ;
20
+ const currentMeetingTime = intervals [ i ] ;
21
+ if ( currentMeetingTime [ 0 ] < previousMeetingTime [ 1 ] ) return false ;
22
+ }
23
+
24
+ return true ;
25
+ }
Original file line number Diff line number Diff line change @@ -41,3 +41,34 @@ function merge(intervals: number[][]): number[][] {
41
41
42
42
return result ;
43
43
}
44
+
45
+ /**
46
+ * 접근 방법 :
47
+ * - O(n)시간복잡도로 풀기 위해서 정렬하지 않고 intervals 병합
48
+ * - 겹치지 않는 구간은 그대로 저장(left, right)
49
+ * - newInterval과 겹치는 구간은 병합하여 하나의 interval로 대체
50
+ *
51
+ * 시간복잡도 : O(n)
52
+ * - n = 인터벌 배열의 길이
53
+ * - 1회 순회하면서 병합하므로 O(n)
54
+ *
55
+ * 공간복잡도 : O(n)
56
+ * - 결과 배열에 담아서 리턴
57
+ */
58
+ function insert ( intervals : number [ ] [ ] , newInterval : number [ ] ) : number [ ] [ ] {
59
+ const left : number [ ] [ ] = [ ] ;
60
+ const right : number [ ] [ ] = [ ] ;
61
+
62
+ for ( const [ start , end ] of intervals ) {
63
+ if ( end < newInterval [ 0 ] ) {
64
+ left . push ( [ start , end ] ) ;
65
+ } else if ( newInterval [ 1 ] < start ) {
66
+ right . push ( [ start , end ] ) ;
67
+ } else {
68
+ newInterval [ 0 ] = Math . min ( newInterval [ 0 ] , start ) ;
69
+ newInterval [ 1 ] = Math . max ( newInterval [ 1 ] , end ) ;
70
+ }
71
+ }
72
+
73
+ return [ ...left , newInterval , ...right ] ;
74
+ }
You can’t perform that action at this time.
0 commit comments