Skip to content

Commit d0b74d1

Browse files
authored
Merge pull request #594 from HC-kang/main
[강희찬] WEEK 14 Solution
2 parents ddcb3f3 + c4d6e96 commit d0b74d1

File tree

5 files changed

+179
-0
lines changed

5 files changed

+179
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// class TreeNode {
2+
// val: number;
3+
// left: TreeNode | null;
4+
// right: TreeNode | null;
5+
// constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6+
// this.val = val === undefined ? 0 : val;
7+
// this.left = left === undefined ? null : left;
8+
// this.right = right === undefined ? null : right;
9+
// }
10+
// }
11+
12+
/**
13+
* https://leetcode.com/problems/binary-tree-level-order-traversal
14+
* T.C. O(n)
15+
* S.C. O(n)
16+
*/
17+
function levelOrder(root: TreeNode | null): number[][] {
18+
const result: number[][] = [];
19+
function dfs(node: TreeNode | null, level: number) {
20+
if (!node) return;
21+
if (!result[level]) result[level] = [];
22+
result[level].push(node.val);
23+
dfs(node.left, level + 1);
24+
dfs(node.right, level + 1);
25+
}
26+
dfs(root, 0);
27+
return result;
28+
}
29+
30+
/**
31+
* bfs
32+
* T.C. O(n)
33+
* S.C. O(n)
34+
*/
35+
function levelOrder(root: TreeNode | null): number[][] {
36+
const result: number[][] = [];
37+
if (!root) return result;
38+
39+
const queue: TreeNode[] = [root];
40+
let start = 0;
41+
42+
while (queue[start]) {
43+
const levelSize = queue.length - start;
44+
const currentLevel: number[] = [];
45+
46+
for (let i = 0; i < levelSize; i++) {
47+
const node = queue[start++];
48+
currentLevel.push(node.val);
49+
if (node.left) queue.push(node.left);
50+
if (node.right) queue.push(node.right);
51+
}
52+
53+
result.push(currentLevel);
54+
}
55+
56+
return result;
57+
}

house-robber-ii/HC-kang.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* https://leetcode.com/problems/house-robber-ii
3+
* T.C. O(n)
4+
* S.C. O(1)
5+
*/
6+
function rob(nums: number[]): number {
7+
if (nums.length === 1) return nums[0];
8+
if (nums.length === 2) return Math.max(nums[0], nums[1]);
9+
if (nums.length === 3) return Math.max(nums[0], nums[1], nums[2]);
10+
11+
function robHelper(nums: number[]): number {
12+
let prev = 0;
13+
let curr = 0;
14+
for (let i = 0; i < nums.length; i++) {
15+
const temp = curr;
16+
curr = Math.max(prev + nums[i], curr);
17+
prev = temp;
18+
}
19+
return curr;
20+
}
21+
22+
const robFirst = robHelper(nums.slice(0, nums.length - 1));
23+
const robLast = robHelper(nums.slice(1));
24+
25+
return Math.max(robFirst, robLast);
26+
}

meeting-rooms-ii/HC-kang.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* https://leetcode.com/problems/meeting-rooms-ii
3+
* T.C. O(nlogn)
4+
* S.C. O(n)
5+
*/
6+
function minMeetingRooms(intervals: number[][]): number {
7+
const starts = intervals.map((interval) => interval[0]).sort((a, b) => a - b);
8+
const ends = intervals.map((interval) => interval[1]).sort((a, b) => a - b);
9+
10+
let rooms = 0;
11+
let endIdx = 0;
12+
for (let i = 0; i < starts.length; i++) {
13+
if (starts[i] < ends[endIdx]) {
14+
rooms++;
15+
} else {
16+
endIdx++;
17+
}
18+
}
19+
20+
return rooms;
21+
}

reverse-bits/HC-kang.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* https://leetcode.com/problems/reverse-bits
3+
* T.C. O(1)
4+
* S.C. O(1)
5+
*/
6+
function reverseBits(n: number): number {
7+
let result = 0;
8+
for (let i = 0; i < 32; i++) {
9+
result = (result << 1) | (n & 1);
10+
n >>= 1;
11+
}
12+
return result >>> 0;
13+
}

word-search-ii/HC-kang.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* https://leetcode.com/problems/word-search-ii
3+
* T.C. O(W * L + M * N * 4^L) W: number of words, L: mean length of words, M: rows, N: cols
4+
* S.C. O(W * L)
5+
*/
6+
function findWords(board: string[][], words: string[]): string[] {
7+
const root = new TrieNode();
8+
for (const word of words) {
9+
let node = root;
10+
for (const char of word) {
11+
if (!node.children[char]) {
12+
node.children[char] = new TrieNode();
13+
}
14+
node = node.children[char];
15+
}
16+
node.word = word;
17+
node.isEnd = true;
18+
}
19+
20+
const result = new Set<string>();
21+
const rows = board.length;
22+
const cols = board[0].length;
23+
24+
function dfs(row: number, col: number, node: TrieNode): void {
25+
if (row < 0 || row >= rows) return;
26+
if (col < 0 || col >= cols) return;
27+
if (!board[row][col]) return;
28+
if (!node.children[board[row][col]]) return;
29+
30+
const char = board[row][col];
31+
const currNode = node.children[char];
32+
33+
if (currNode.isEnd) {
34+
result.add(currNode.word);
35+
}
36+
37+
board[row][col] = '#';
38+
39+
dfs(row + 1, col, currNode);
40+
dfs(row - 1, col, currNode);
41+
dfs(row, col + 1, currNode);
42+
dfs(row, col - 1, currNode);
43+
44+
board[row][col] = char;
45+
}
46+
47+
for (let i = 0; i < rows; i++) {
48+
for (let j = 0; j < cols; j++) {
49+
dfs(i, j, root);
50+
}
51+
}
52+
53+
return Array.from(result);
54+
}
55+
56+
class TrieNode {
57+
constructor(
58+
public children: Record<string, TrieNode> = {},
59+
public word: string = '',
60+
public isEnd: boolean = false
61+
) {}
62+
}

0 commit comments

Comments
 (0)