Skip to content

Commit a24465c

Browse files
authored
Merge pull request #148 from nhistory/week9
[Sehwan] Week9 solution with Javascript
2 parents 7f100e6 + ad131ab commit a24465c

File tree

5 files changed

+224
-0
lines changed

5 files changed

+224
-0
lines changed

clone-graph/nhistory.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* // Definition for a _Node.
3+
* function _Node(val, neighbors) {
4+
* this.val = val === undefined ? 0 : val;
5+
* this.neighbors = neighbors === undefined ? [] : neighbors;
6+
* };
7+
*/
8+
9+
/**
10+
* @param {_Node} node
11+
* @return {_Node}
12+
*/
13+
var cloneGraph = function (node) {
14+
let visited = {};
15+
16+
const dfs = (node) => {
17+
if (!node) return node;
18+
if (visited[node.val]) return visited[node.val];
19+
20+
let root = new Node(node.val);
21+
visited[node.val] = root;
22+
23+
for (let neighbor of node.neighbors) {
24+
root.neighbors.push(dfs(neighbor));
25+
}
26+
return root;
27+
};
28+
29+
return dfs(node);
30+
};
31+
32+
// TC: O(n+e) -> n: number of nodes | e: number of edges
33+
// SC: O(v) -> v: length of visited object

course-schedule/nhistory.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @param {number} numCourses
3+
* @param {number[][]} prerequisites
4+
* @return {boolean}
5+
*/
6+
var canFinish = function (numCourses, prerequisites) {
7+
// Initialize in-degree array and graph map
8+
const inDegree = Array(numCourses).fill(0);
9+
const graph = new Map();
10+
11+
// Build the graph and compute in-degrees
12+
prerequisites.forEach(([course, pre]) => {
13+
inDegree[course]++;
14+
if (!graph.has(pre)) {
15+
graph.set(pre, []);
16+
}
17+
graph.get(pre).push(course);
18+
});
19+
20+
// Queue for courses with no prerequisites
21+
const queue = [];
22+
for (let i = 0; i < numCourses; i++) {
23+
if (inDegree[i] === 0) {
24+
queue.push(i);
25+
}
26+
}
27+
28+
// Process the courses
29+
let count = 0;
30+
while (queue.length > 0) {
31+
const course = queue.shift();
32+
count++;
33+
if (graph.has(course)) {
34+
graph.get(course).forEach((nextCourse) => {
35+
inDegree[nextCourse]--;
36+
if (inDegree[nextCourse] === 0) {
37+
queue.push(nextCourse);
38+
}
39+
});
40+
}
41+
}
42+
43+
// Return true if all courses can be finished
44+
return count === numCourses;
45+
};
46+
47+
// TC: O(V + E)
48+
// V is the number of courses, E is the number of prerequisites.
49+
// SC: O(V + E)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
var WordDictionary = function () {
2+
this.dictionary = new Set();
3+
};
4+
5+
/**
6+
* @param {string} word
7+
* @return {void}
8+
*/
9+
WordDictionary.prototype.addWord = function (word) {
10+
this.dictionary.add(word);
11+
};
12+
13+
/**
14+
* @param {string} word
15+
* @return {boolean}
16+
*/
17+
WordDictionary.prototype.search = function (word) {
18+
if (word.indexOf(".") != -1) {
19+
// Case of word has a '.'
20+
for (let str of this.dictionary) {
21+
if (str.length != word.length) continue;
22+
let i;
23+
for (i = 0; i < word.length; i++) {
24+
if (word[i] === ".") continue;
25+
if (word[i] != str[i]) break;
26+
}
27+
if (i === str.length) return true;
28+
}
29+
return false;
30+
} else {
31+
return this.dictionary.has(word);
32+
}
33+
};
34+
35+
// n: number of words | m: length of the word
36+
// TC: O(n*m)
37+
// SC: O(n*m)

number-of-islands/nhistory.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
var numIslands = function (grid) {
2+
// Declare row and column length
3+
const m = grid.length,
4+
n = grid[0].length;
5+
let numIslands = 0;
6+
7+
// Available directions for depth-first search
8+
const dir = [
9+
[0, 1],
10+
[1, 0],
11+
[0, -1],
12+
[-1, 0],
13+
];
14+
15+
// Function to depth-first search inside of grid
16+
const dfs = (i, j) => {
17+
grid[i][j] = "2";
18+
19+
let x, y;
20+
for (d of dir) {
21+
x = i + d[0];
22+
y = j + d[1];
23+
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] === "1") {
24+
dfs(x, y);
25+
}
26+
}
27+
return;
28+
};
29+
30+
for (let i = 0; i < m; i++) {
31+
for (let j = 0; j < n; j++) {
32+
if (grid[i][j] === "1") {
33+
dfs(i, j);
34+
numIslands++;
35+
}
36+
}
37+
}
38+
return numIslands;
39+
};
40+
41+
// TC: O(m*n)
42+
// SC: O(m*n)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* @param {number[][]} heights
3+
* @return {number[][]}
4+
*/
5+
var pacificAtlantic = function (heights) {
6+
const m = heights.length,
7+
n = heights[0].length;
8+
let result = [];
9+
10+
const pacific = new Array(m).fill(null).map(() => new Array(n).fill(false));
11+
const atlantic = new Array(m).fill(null).map(() => new Array(n).fill(false));
12+
13+
const dir = [
14+
[0, 1],
15+
[1, 0],
16+
[0, -1],
17+
[-1, 0],
18+
];
19+
20+
const dfs = (i, j, ocean) => {
21+
// Check visited cell
22+
ocean[i][j] = true;
23+
24+
for (d of dir) {
25+
let x = i + d[0],
26+
y = j + d[1];
27+
if (
28+
x >= 0 &&
29+
x < m &&
30+
y >= 0 &&
31+
y < n &&
32+
!ocean[x][y] &&
33+
heights[x][y] >= heights[i][j]
34+
) {
35+
dfs(x, y, ocean);
36+
}
37+
}
38+
};
39+
40+
// Check the cells can flow left and right edge
41+
for (let i = 0; i < m; i++) {
42+
dfs(i, 0, pacific);
43+
dfs(i, n - 1, atlantic);
44+
}
45+
46+
// Check the cells can flow top and bottom edge
47+
for (let j = 0; j < n; j++) {
48+
dfs(0, j, pacific);
49+
dfs(m - 1, j, atlantic);
50+
}
51+
52+
for (let i = 0; i < m; i++) {
53+
for (let j = 0; j < n; j++) {
54+
if (pacific[i][j] && atlantic[i][j]) {
55+
result.push([i, j]);
56+
}
57+
}
58+
}
59+
return result;
60+
};
61+
62+
// TC: O(m*n)
63+
// SC: O(m*n)

0 commit comments

Comments
 (0)