From e7dc805492ae421fa226c2bea0152404e0982e8b Mon Sep 17 00:00:00 2001 From: ganu Date: Mon, 20 Jan 2025 08:43:44 +0900 Subject: [PATCH 1/7] feat: 206. Reverse Linked List --- reverse-linked-list/gwbaik9717.js | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 reverse-linked-list/gwbaik9717.js diff --git a/reverse-linked-list/gwbaik9717.js b/reverse-linked-list/gwbaik9717.js new file mode 100644 index 000000000..a2e7f5e93 --- /dev/null +++ b/reverse-linked-list/gwbaik9717.js @@ -0,0 +1,40 @@ +// Time complexity: O(n) +// Space complexity: O(n) + +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode} head + * @return {ListNode} + */ +var reverseList = function (head) { + const stack = []; + + let temp = head; + while (temp) { + stack.push(temp.val); + temp = temp.next; + } + + if (!stack.length) { + return null; + } + + const popped = stack.pop(); + const answer = new ListNode(popped); + + temp = answer; + while (stack.length > 0) { + const popped = stack.pop(); + + temp.next = new ListNode(popped); + temp = temp.next; + } + + return answer; +}; From 9defd5e9e9bb57dd1e4584b5947c312bba989ee2 Mon Sep 17 00:00:00 2001 From: ganu Date: Tue, 21 Jan 2025 07:52:10 +0900 Subject: [PATCH 2/7] refactor: 206. Reverse Linked List space complexity to O(1) --- reverse-linked-list/gwbaik9717.js | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/reverse-linked-list/gwbaik9717.js b/reverse-linked-list/gwbaik9717.js index a2e7f5e93..68dc8f9f1 100644 --- a/reverse-linked-list/gwbaik9717.js +++ b/reverse-linked-list/gwbaik9717.js @@ -1,5 +1,5 @@ // Time complexity: O(n) -// Space complexity: O(n) +// Space complexity: O(1) /** * Definition for singly-linked list. @@ -13,28 +13,15 @@ * @return {ListNode} */ var reverseList = function (head) { - const stack = []; + let current = head; + let prev = null; - let temp = head; - while (temp) { - stack.push(temp.val); - temp = temp.next; + while (current) { + const node = new ListNode(current.val); + node.next = prev; + prev = node; + current = current.next; } - if (!stack.length) { - return null; - } - - const popped = stack.pop(); - const answer = new ListNode(popped); - - temp = answer; - while (stack.length > 0) { - const popped = stack.pop(); - - temp.next = new ListNode(popped); - temp = temp.next; - } - - return answer; + return prev; }; From 516540ef8e85bcf56bccaaa348c99b55865a55b9 Mon Sep 17 00:00:00 2001 From: ganu Date: Tue, 21 Jan 2025 08:35:16 +0900 Subject: [PATCH 3/7] feat: 3. Longest Substring Without Repeating Characters --- .../gwbaik9717.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 longest-substring-without-repeating-characters/gwbaik9717.js diff --git a/longest-substring-without-repeating-characters/gwbaik9717.js b/longest-substring-without-repeating-characters/gwbaik9717.js new file mode 100644 index 000000000..02c599e33 --- /dev/null +++ b/longest-substring-without-repeating-characters/gwbaik9717.js @@ -0,0 +1,30 @@ +// n: len(s) +// Time complexity: O(n^2) +// Space complexity: O(n) + +/** + * @param {string} s + * @return {number} + */ +var lengthOfLongestSubstring = function (s) { + let answer = 0; + const map = new Map(); + + for (let i = 0; i < s.length; i++) { + const chr = s[i]; + + if (map.has(chr)) { + const temp = map.get(chr); + for (const [key, value] of map) { + if (value <= temp) { + map.delete(key); + } + } + } + + map.set(chr, i); + answer = Math.max(answer, map.size); + } + + return answer; +}; From c64fe4939b4e36416dc3cad2fa9649290fac47f1 Mon Sep 17 00:00:00 2001 From: ganu Date: Fri, 24 Jan 2025 08:42:38 +0900 Subject: [PATCH 4/7] feat: 200. Number of Islands --- number-of-islands/gwbaik9717.js | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 number-of-islands/gwbaik9717.js diff --git a/number-of-islands/gwbaik9717.js b/number-of-islands/gwbaik9717.js new file mode 100644 index 000000000..c4f3b14f8 --- /dev/null +++ b/number-of-islands/gwbaik9717.js @@ -0,0 +1,71 @@ +// w: width of grid, h: height of grid +// Time complexity: O(h*w) +// Space complexity: O(h*w) + +class MyQueue { + constructor() { + this.q = []; + this.front = 0; + this.rear = 0; + } + + get isEmpty() { + return this.front === this.rear; + } + + push(value) { + this.q.push(value); + this.rear++; + } + + pop() { + const value = this.q[this.front]; + delete this.q[this.front++]; + return value; + } +} + +/** + * @param {character[][]} grid + * @return {number} + */ +var numIslands = function (grid) { + const h = grid.length; + const w = grid[0].length; + + const dy = [1, 0, -1, 0]; + const dx = [0, 1, 0, -1]; + + const bfs = (start) => { + const q = new MyQueue(); + q.push(start); + const [sy, sx] = start; + grid[sy][sx] = "0"; + + while (!q.isEmpty) { + const [cy, cx] = q.pop(); + + for (let i = 0; i < dy.length; i++) { + const ny = cy + dy[i]; + const nx = cx + dx[i]; + + if (ny >= 0 && ny < h && nx >= 0 && nx < w && grid[ny][nx] === "1") { + q.push([ny, nx]); + grid[ny][nx] = "0"; + } + } + } + }; + + let answer = 0; + for (let i = 0; i < h; i++) { + for (let j = 0; j < w; j++) { + if (grid[i][j] === "1") { + answer++; + bfs([i, j]); + } + } + } + + return answer; +}; From e7f8a28eda415ee7866722453aa0279a4b5bc50a Mon Sep 17 00:00:00 2001 From: ganu Date: Fri, 24 Jan 2025 08:57:09 +0900 Subject: [PATCH 5/7] feat: 62. Unique Paths --- unique-paths/gwbaik9717.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 unique-paths/gwbaik9717.js diff --git a/unique-paths/gwbaik9717.js b/unique-paths/gwbaik9717.js new file mode 100644 index 000000000..8fdeb464c --- /dev/null +++ b/unique-paths/gwbaik9717.js @@ -0,0 +1,30 @@ +// m: height of grid, n: width of grid +// Time complexity: O(m*n) +// Space complexity: O(m*n) + +/** + * @param {number} m + * @param {number} n + * @return {number} + */ +var uniquePaths = function (m, n) { + const dp = Array.from({ length: m }, () => + Array.from({ length: n }, () => 0) + ); + + dp[0][0] = 1; + + for (let i = 0; i < m; i++) { + for (let j = 0; j < n; j++) { + if (i >= 1) { + dp[i][j] += dp[i - 1][j]; + } + + if (j >= 1) { + dp[i][j] += dp[i][j - 1]; + } + } + } + + return dp.at(-1).at(-1); +}; From 4847a02933f5d675ec37424f3bccc25f979e3915 Mon Sep 17 00:00:00 2001 From: ganu Date: Fri, 24 Jan 2025 09:17:24 +0900 Subject: [PATCH 6/7] feat: 73. Set Matrix Zeroes --- set-matrix-zeroes/gwbaik9717.js | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 set-matrix-zeroes/gwbaik9717.js diff --git a/set-matrix-zeroes/gwbaik9717.js b/set-matrix-zeroes/gwbaik9717.js new file mode 100644 index 000000000..39340b74a --- /dev/null +++ b/set-matrix-zeroes/gwbaik9717.js @@ -0,0 +1,36 @@ +// m: height of matrix, n: width of matrix +// Time complexity: O(m*n) +// Space complexity: O(m+n) + +/** + * @param {number[][]} matrix + * @return {void} Do not return anything, modify matrix in-place instead. + */ +var setZeroes = function (matrix) { + const h = matrix.length; + const w = matrix[0].length; + + const setY = new Set(); + const setX = new Set(); + + for (let i = 0; i < h; i++) { + for (let j = 0; j < w; j++) { + if (matrix[i][j] === 0) { + setY.add(i); + setX.add(j); + } + } + } + + for (const y of setY) { + for (let x = 0; x < w; x++) { + matrix[y][x] = 0; + } + } + + for (const x of setX) { + for (let y = 0; y < h; y++) { + matrix[y][x] = 0; + } + } +}; From 12c3b94bca721a735c04dcaa731adc51d630e4a0 Mon Sep 17 00:00:00 2001 From: ganu Date: Fri, 24 Jan 2025 10:32:21 +0900 Subject: [PATCH 7/7] refactor: 73. Set Matrix Zeroes to reduce Space complexity to O(1) --- set-matrix-zeroes/gwbaik9717.js | 57 ++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/set-matrix-zeroes/gwbaik9717.js b/set-matrix-zeroes/gwbaik9717.js index 39340b74a..7643a4a10 100644 --- a/set-matrix-zeroes/gwbaik9717.js +++ b/set-matrix-zeroes/gwbaik9717.js @@ -1,6 +1,6 @@ // m: height of matrix, n: width of matrix // Time complexity: O(m*n) -// Space complexity: O(m+n) +// Space complexity: O(1) /** * @param {number[][]} matrix @@ -10,27 +10,60 @@ var setZeroes = function (matrix) { const h = matrix.length; const w = matrix[0].length; - const setY = new Set(); - const setX = new Set(); + // a flag for iterating rows of the first column + let temp1 = false; + + // a flag for iterating cols of the first row + let temp2 = false; for (let i = 0; i < h; i++) { - for (let j = 0; j < w; j++) { + if (matrix[i][0] === 0) { + temp1 = true; + break; + } + } + + for (let i = 0; i < w; i++) { + if (matrix[0][i] === 0) { + temp2 = true; + break; + } + } + + for (let i = 1; i < h; i++) { + for (let j = 1; j < w; j++) { if (matrix[i][j] === 0) { - setY.add(i); - setX.add(j); + matrix[i][0] = 0; + matrix[0][j] = 0; } } } - for (const y of setY) { - for (let x = 0; x < w; x++) { - matrix[y][x] = 0; + for (let i = 1; i < h; i++) { + if (matrix[i][0] === 0) { + for (let j = 1; j < w; j++) { + matrix[i][j] = 0; + } } } - for (const x of setX) { - for (let y = 0; y < h; y++) { - matrix[y][x] = 0; + for (let i = 1; i < w; i++) { + if (matrix[0][i] === 0) { + for (let j = 1; j < h; j++) { + matrix[j][i] = 0; + } + } + } + + if (temp1) { + for (let i = 0; i < h; i++) { + matrix[i][0] = 0; + } + } + + if (temp2) { + for (let j = 0; j < w; j++) { + matrix[0][j] = 0; } } };