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[][] {
4141
4242 return result ;
4343}
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