Skip to content

Commit 5472958

Browse files
authored
Merge pull request #1638 from HoonDongKang/main
[HoonDongKang] Week 14 Solutions
2 parents 2d8c098 + dda5917 commit 5472958

File tree

5 files changed

+241
-0
lines changed

5 files changed

+241
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* [Problem]: [102] Binary Tree Level Order Traversal
3+
* (https://leetcode.com/problems/binary-tree-level-order-traversal/description/)
4+
*/
5+
6+
class TreeNode {
7+
val: number;
8+
left: TreeNode | null;
9+
right: TreeNode | null;
10+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
11+
this.val = val === undefined ? 0 : val;
12+
this.left = left === undefined ? null : left;
13+
this.right = right === undefined ? null : right;
14+
}
15+
}
16+
17+
// 시간복잡도 O(n)
18+
// 공간복잡도 O(n)
19+
function levelOrder(root: TreeNode | null): number[][] {
20+
if (!root) return [];
21+
22+
const result: number[][] = [];
23+
const queue: TreeNode[] = [root];
24+
25+
while (queue.length > 0) {
26+
const level = queue.length;
27+
const values: number[] = [];
28+
29+
for (let i = 0; i < level; i++) {
30+
const node = queue.shift()!;
31+
values.push(node.val);
32+
33+
if (node.left) queue.push(node.left);
34+
if (node.right) queue.push(node.right);
35+
}
36+
37+
result.push(values);
38+
}
39+
40+
return result;
41+
}

counting-bits/HoonDongKang.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* [Problem]: [338] Counting Bits
3+
* (https://leetcode.com/problems/counting-bits/description/)
4+
*/
5+
function countBits(n: number): number[] {
6+
//시간복잡도 O(n)
7+
//공간복잡도 O(n)
8+
function dpFunc(n: number): number[] {
9+
const dp = new Array(n + 1).fill(0);
10+
let offset = 1;
11+
12+
for (let i = 1; i <= n; i++) {
13+
if (offset * 2 === i) {
14+
offset = i;
15+
}
16+
17+
dp[i] = 1 + dp[i - offset];
18+
}
19+
20+
return dp;
21+
}
22+
23+
//시간복잡도 O(n)
24+
//공간복잡도 O(n)
25+
function optimizedFunc(n: number): number[] {
26+
const dp = new Array(n + 1).fill(0);
27+
for (let i = 0; i <= n; i++) {
28+
dp[i] = dp[i >> 1] + (i & 1);
29+
}
30+
return dp;
31+
}
32+
}

house-robber-ii/HoonDongKang.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* [Problem]: [213] House Robber II
3+
* (https://leetcode.com/problems/house-robber-ii/description/)
4+
*/
5+
function rob(nums: number[]): number {
6+
//시간복잡도 O(n)
7+
//공간복잡도 O(n)
8+
function memoizationFunc(nums: number[]): number {
9+
const memo = new Map<string, number>();
10+
const length = nums.length;
11+
12+
function dfs(idx: number, first = false) {
13+
const key = `${idx}_${first}`;
14+
if (memo.has(key)) return memo.get(key)!;
15+
16+
if (idx === length - 1) return first ? 0 : nums[idx];
17+
if (idx >= length) return 0;
18+
if (idx === 0) {
19+
const result = Math.max(nums[0] + dfs(2, true), dfs(1, false));
20+
memo.set(key, result);
21+
return result;
22+
}
23+
24+
const result = Math.max(nums[idx] + dfs(idx + 2, first), dfs(idx + 1, first));
25+
memo.set(key, result);
26+
return result;
27+
}
28+
29+
return dfs(0);
30+
}
31+
32+
//시간복잡도 O(n)
33+
//공간복잡도 O(1)
34+
function dpFunc(nums: number[]): number {
35+
if (nums.length === 1) return nums[0];
36+
37+
function dp(start: number, end: number) {
38+
let prev = 0;
39+
let cur = 0;
40+
41+
for (let i = start; i < end; i++) {
42+
[prev, cur] = [cur, Math.max(prev + nums[i], cur)];
43+
}
44+
45+
return cur;
46+
}
47+
48+
return Math.max(dp(0, nums.length - 1), dp(1, nums.length));
49+
}
50+
}

meeting-rooms-ii/HoonDongKang.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* [Problem]: [919] Meeting Rooms II
3+
* (https://www.lintcode.com/problem/919/)
4+
*/
5+
6+
export class Interval {
7+
start: number;
8+
end: number;
9+
constructor(start: number, end: number) {
10+
this.start = start;
11+
this.end = end;
12+
}
13+
}
14+
15+
// 시간복잡도 O(n log n)
16+
// 공간복잡도 O(n)
17+
export class Solution {
18+
/**
19+
* @param intervals: an array of meeting time intervals
20+
* @return: the minimum number of conference rooms required
21+
*/
22+
minMeetingRooms(intervals: Interval[]): number {
23+
if (intervals.length === 0) return 0;
24+
25+
const starts = intervals.map((i) => i.start).sort((a, b) => a - b);
26+
const ends = intervals.map((i) => i.end).sort((a, b) => a - b);
27+
28+
let count = 0;
29+
let maxCount = 0;
30+
let endIdx = 0;
31+
32+
for (let i = 0; i < intervals.length; i++) {
33+
if (starts[i] < ends[endIdx]) {
34+
count++;
35+
} else {
36+
endIdx++;
37+
}
38+
39+
maxCount = Math.max(maxCount, count);
40+
}
41+
42+
return maxCount;
43+
}
44+
}

word-search-ii/HoonDongKang.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/**
2+
* [Problem]: [212] Word Search II
3+
* (https://leetcode.com/problems/word-search-ii/)
4+
*/
5+
6+
class TrieNode {
7+
children: Map<string, TrieNode> = new Map();
8+
word: string | null = null;
9+
}
10+
11+
//시간복잡도 O(m * n * 4^s)
12+
//공간복잡도 O(trie 저장 공간(word * length) + result)
13+
function findWords(board: string[][], words: string[]): string[] {
14+
const result: string[] = [];
15+
const rows = board.length;
16+
const cols = board[0].length;
17+
18+
const root = new TrieNode();
19+
for (const word of words) {
20+
let node = root;
21+
22+
for (const char of word) {
23+
if (!node.children.has(char)) {
24+
node.children.set(char, new TrieNode());
25+
}
26+
node = node.children.get(char)!;
27+
}
28+
29+
node.word = word;
30+
}
31+
32+
const dfs = (i: number, j: number, node: TrieNode) => {
33+
const char = board[i][j];
34+
const next = node.children.get(char);
35+
if (!next) return;
36+
37+
if (next.word) {
38+
result.push(next.word);
39+
next.word = null;
40+
}
41+
42+
board[i][j] = "#";
43+
44+
const directions = [
45+
[0, 1],
46+
[1, 0],
47+
[0, -1],
48+
[-1, 0],
49+
];
50+
51+
for (const [dx, dy] of directions) {
52+
const ni = i + dx;
53+
const nj = j + dy;
54+
55+
if (ni >= 0 && ni < rows && nj >= 0 && nj < cols && board[ni][nj] !== "#") {
56+
dfs(ni, nj, next);
57+
}
58+
}
59+
60+
board[i][j] = char;
61+
62+
if (next.children.size === 0) {
63+
node.children.delete(char);
64+
}
65+
};
66+
67+
for (let i = 0; i < rows; i++) {
68+
for (let j = 0; j < cols; j++) {
69+
dfs(i, j, root);
70+
}
71+
}
72+
73+
return result;
74+
}

0 commit comments

Comments
 (0)