From 71d2d0e68828ab075c8aa6e9597d167b7e2df031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A9=E1=84=92=E1=85=A8=E1=84=85=E1=85=B5?= =?UTF-8?q?=E1=86=AB?= Date: Tue, 14 Oct 2025 22:58:47 +0900 Subject: [PATCH 1/6] meeting rooms solution --- meeting-rooms/hyer0705.ts | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 meeting-rooms/hyer0705.ts diff --git a/meeting-rooms/hyer0705.ts b/meeting-rooms/hyer0705.ts new file mode 100644 index 000000000..b30f28a97 --- /dev/null +++ b/meeting-rooms/hyer0705.ts @@ -0,0 +1,40 @@ +import { Interval } from "../home/lib/index"; +/** + * Definition of Interval: + * export class Interval { + * start :number; + * end :number; + * constructor(start :number, end :number) { + * this.start = start; + * this.end = end; + * } + * } + */ + +export class Solution { + /** + * Time Complexity: O(nlogn) + * Space Complexity: O(1) + * + * @param intervals: an array of meeting time intervals + * @return: if a person could attend all meetings + */ + canAttendMeetings(intervals: Interval[]): boolean { + if (intervals.length <= 1) return true; + + intervals.sort((a, b) => a.start - b.start); + + let prevEnd = intervals[0].end; + for (let i = 1; i < intervals.length; i++) { + const currentStart = intervals[i].start; + const currentEnd = intervals[i].end; + + if (prevEnd > currentStart) { + return false; + } + prevEnd = currentEnd; + } + + return true; + } +} From 96c50c3f9abc8574c3c3704e1a5a24d1ac65d3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A9=E1=84=92=E1=85=A8=E1=84=85=E1=85=B5?= =?UTF-8?q?=E1=86=AB?= Date: Tue, 14 Oct 2025 23:55:28 +0900 Subject: [PATCH 2/6] lowest common ancestor of a binary search tree solution --- .../hyer0705.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts diff --git a/lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts b/lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts new file mode 100644 index 000000000..ff9e0525e --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts @@ -0,0 +1,25 @@ +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + * + * Time Complexity: O(h) where h is the height of the tree + * Space Complexity: O(1) + */ +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + if (p.val < root.val && q.val < root.val) { + return lowestCommonAncestor(root.left, p, q); + } else if (p.val > root.val && q.val > root.val) { + return lowestCommonAncestor(root.right, p, q); + } + + return root; +} From df60970806ecc82631b928981f46cbb10012cbc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A9=E1=84=92=E1=85=A8=E1=84=85=E1=85=B5?= =?UTF-8?q?=E1=86=AB?= Date: Wed, 15 Oct 2025 00:01:05 +0900 Subject: [PATCH 3/6] update complexity --- lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts b/lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts index ff9e0525e..7e2cce5cb 100644 --- a/lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts +++ b/lowest-common-ancestor-of-a-binary-search-tree/hyer0705.ts @@ -11,8 +11,8 @@ * } * } * - * Time Complexity: O(h) where h is the height of the tree - * Space Complexity: O(1) + * Time Complexity: O(logn) in average, O(n) in the worst case + * Space Complexity: O(logn) in average, O(n) in the worst case */ function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { if (p.val < root.val && q.val < root.val) { From 42e9f700accb51a4198337dee9a83222007f0d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A9=E1=84=92=E1=85=A8=E1=84=85=E1=85=B5?= =?UTF-8?q?=E1=86=AB?= Date: Sat, 18 Oct 2025 11:36:59 +0900 Subject: [PATCH 4/6] kth smallest element in a bst solution --- kth-smallest-element-in-a-bst/hyer0705.ts | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 kth-smallest-element-in-a-bst/hyer0705.ts diff --git a/kth-smallest-element-in-a-bst/hyer0705.ts b/kth-smallest-element-in-a-bst/hyer0705.ts new file mode 100644 index 000000000..26a66275a --- /dev/null +++ b/kth-smallest-element-in-a-bst/hyer0705.ts @@ -0,0 +1,38 @@ +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + */ + +// Time Complexity: O(k) - 최악의 경우 모든 노드를 방문하면 O(n) +// Space Complexity: O(h) - 재귀 호출 스택의 최대 깊이 (h는 트리의 높이) +function kthSmallest(root: TreeNode | null, k: number): number { + let count = 0; + let result = 0; + + const inorder = (node: TreeNode | null): void => { + if (!node) return; + + inorder(node.left); + + count++; + if (count === k) { + result = node.val; + return; + } + + inorder(node.right); + }; + + inorder(root); + + return result; +} From 34f444afc66b9d704b8851ea4746b81feaf5fc6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A9=E1=84=92=E1=85=A8=E1=84=85=E1=85=B5?= =?UTF-8?q?=E1=86=AB?= Date: Sat, 18 Oct 2025 12:04:03 +0900 Subject: [PATCH 5/6] insert interval solution --- insert-interval/hyer0705.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 insert-interval/hyer0705.ts diff --git a/insert-interval/hyer0705.ts b/insert-interval/hyer0705.ts new file mode 100644 index 000000000..f96d7de7e --- /dev/null +++ b/insert-interval/hyer0705.ts @@ -0,0 +1,24 @@ +// Time Complexity: O(n) +// Space Complexity: O(n) +function insert(intervals: number[][], newInterval: number[]): number[][] { + const result: number[][] = []; + let merged = newInterval; + let i = 0; + + while (i < intervals.length && intervals[i][1] < merged[0]) { + result.push(intervals[i++]); + } + + while (i < intervals.length && intervals[i][0] <= merged[1]) { + merged[0] = Math.min(merged[0], intervals[i][0]); + merged[1] = Math.max(merged[1], intervals[i][1]); + i++; + } + result.push(merged); + + while (i < intervals.length && intervals[i][0] > merged[1]) { + result.push(intervals[i++]); + } + + return result; +} From 012343e7edd437b3d9a4afb3cc02c2feb53d8608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8C=E1=85=A9=E1=84=92=E1=85=A8=E1=84=85=E1=85=B5?= =?UTF-8?q?=E1=86=AB?= Date: Sat, 18 Oct 2025 12:46:37 +0900 Subject: [PATCH 6/6] find median from data stream solution --- find-median-from-data-stream/hyer0705.ts | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 find-median-from-data-stream/hyer0705.ts diff --git a/find-median-from-data-stream/hyer0705.ts b/find-median-from-data-stream/hyer0705.ts new file mode 100644 index 000000000..ecbd6a8ba --- /dev/null +++ b/find-median-from-data-stream/hyer0705.ts @@ -0,0 +1,50 @@ +class MedianFinder { + private left: PriorityQueue; + private right: PriorityQueue; + + constructor() { + this.left = new PriorityQueue((a, b) => b - a); // 최대 힙 + this.right = new PriorityQueue((a, b) => a - b); // 최소 힙 + } + + addNum(num: number): void { + if (this.left.isEmpty() || num <= this.left.front()) { + this.left.enqueue(num); + } else { + this.right.enqueue(num); + } + + if (this.left.size() > this.right.size() + 1) { + this.right.enqueue(this.left.dequeue()); + } + + if (this.right.size() > this.left.size()) { + this.left.enqueue(this.right.dequeue()); + } + + if (!this.right.isEmpty() && this.left.front() > this.right.front()) { + const maxValue = this.left.dequeue(); + + this.right.enqueue(maxValue); + } + } + + findMedian(): number { + let result = 0; + + if (this.left.size() === this.right.size()) { + result = (this.left.front() + this.right.front()) / 2; + } else if (this.left.size() === this.right.size() + 1) { + result = this.left.front(); + } + + return result; + } +} + +/** + * Your MedianFinder object will be instantiated and called as such: + * var obj = new MedianFinder() + * obj.addNum(num) + * var param_2 = obj.findMedian() + */