Skip to content

Commit 00b737a

Browse files
authored
Improved tasks 92-347
1 parent 82113be commit 00b737a

File tree

18 files changed

+133
-146
lines changed

18 files changed

+133
-146
lines changed

src/main/ts/g0001_0100/s0092_reverse_linked_list_ii/solution.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ function reverseBetween(head: ListNode | null, left: number, right: number): Lis
3535
prev1 = tail
3636
tail = next
3737
}
38-
if (prev !== null) {
39-
prev.next = prev1
40-
} else {
38+
if (prev === null) {
4139
head = prev1
40+
} else {
41+
prev.next = prev1
4242
}
4343
if (start !== null) {
4444
start.next = tail

src/main/ts/g0001_0100/s0097_interleaving_string/solution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function isInterleave(s1: string, s2: string, s3: string): boolean {
55
if (s3.length !== s1.length + s2.length) {
66
return false
77
}
8-
const cache: boolean[][] = Array.from({ length: s1.length + 1 }, () => Array(s2.length + 1).fill(null))
8+
const cache: boolean[][] = Array.from({ length: s1.length + 1 }, () => new Array(s2.length + 1).fill(null))
99
return isInterleaveHelper(s1, s2, s3, 0, 0, 0, cache)
1010
}
1111

src/main/ts/g0101_0200/s0101_symmetric_tree/solution.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ function isSymmetric(root: TreeNode | null): boolean {
3333
if (!leftNode || !rightNode || leftNode.val != rightNode.val) {
3434
return false
3535
}
36-
queue.push([leftNode.left, rightNode.right])
37-
queue.push([leftNode.right, rightNode.left])
36+
queue.push([leftNode.left, rightNode.right], [leftNode.right, rightNode.left])
3837
}
3938
}
4039
return true

src/main/ts/g0101_0200/s0103_binary_tree_zigzag_level_order_traversal/solution.ts

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,31 @@ import { TreeNode } from '../../com_github_leetcode/treenode'
1818
* }
1919
*/
2020
function zigzagLevelOrder(root: TreeNode | null): number[][] {
21+
if (!root) return []
22+
2123
const result: number[][] = []
22-
if (root === null) {
23-
return result
24-
}
25-
const q: (TreeNode | null)[] = [root, null]
26-
let zig = true
27-
let level: number[] = []
28-
while (q.length > 0) {
29-
const node = q.shift()
30-
if (node === null) {
31-
result.push(level)
32-
zig = !zig
33-
level = []
34-
if (q.length > 0) {
35-
q.push(null)
36-
}
37-
} else {
38-
if (zig) {
39-
level.push(node.val)
40-
} else {
41-
level.unshift(node.val)
42-
}
43-
if (node.left !== null) {
44-
q.push(node.left)
45-
}
46-
if (node.right !== null) {
47-
q.push(node.right)
48-
}
24+
const queue: TreeNode[] = [root]
25+
let leftToRight = true
26+
27+
while (queue.length) {
28+
const size = queue.length
29+
const level = new Array<number>(size)
30+
31+
for (let i = 0; i < size; i++) {
32+
const node = queue.shift()!
33+
const index = leftToRight ? i : size - 1 - i
34+
level[index] = node.val
35+
36+
if (node.left) queue.push(node.left)
37+
if (node.right) queue.push(node.right)
4938
}
39+
40+
result.push(level)
41+
leftToRight = !leftToRight
5042
}
43+
5144
return result
5245
}
5346

47+
5448
export { zigzagLevelOrder }

src/main/ts/g0101_0200/s0120_triangle/solution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function minimumTotal(triangle: number[][]): number {
88
}
99
const rows = triangle.length
1010
const cols = triangle[rows - 1].length
11-
const dp: number[][] = Array.from({ length: rows }, () => Array(cols).fill(-10001))
11+
const dp: number[][] = Array.from({ length: rows }, () => new Array(cols).fill(-10001))
1212
function dfs(row: number, col: number): number {
1313
if (row >= triangle.length) {
1414
return 0

src/main/ts/g0101_0200/s0125_valid_palindrome/solution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function isPalindrome(s: string): boolean {
55
if (s.length < 2) {
66
return true
77
}
8-
let sFormated = s.toLowerCase().replace(/[^a-zA-Z0-9]/g, '')
8+
let sFormated = s.toLowerCase().replaceAll(/[^a-zA-Z0-9]/g, '')
99
let reversed = sFormated.split('').reverse().join('').replace(',', '')
1010
return sFormated === reversed
1111
}

src/main/ts/g0101_0200/s0127_word_ladder/solution.ts

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,40 @@
33
// #2025_04_07_Time_41_ms_(95.63%)_Space_63.50_MB_(82.78%)
44

55
function ladderLength(beginWord: string, endWord: string, wordList: string[]): number {
6-
const wordSet: Set<string> = new Set(wordList)
7-
if (!wordSet.has(endWord)) {
8-
return 0
9-
}
10-
let beginSet: Set<string> = new Set([beginWord])
11-
let endSet: Set<string> = new Set([endWord])
12-
const visited: Set<string> = new Set()
13-
let len = 1
14-
const wordLen = beginWord.length
15-
while (beginSet.size > 0 && endSet.size > 0) {
16-
if (beginSet.size > endSet.size) {
17-
;[beginSet, endSet] = [endSet, beginSet]
18-
}
19-
const tempSet: Set<string> = new Set()
20-
for (const word of beginSet) {
21-
const chars = word.split('')
22-
for (let i = 0; i < wordLen; i++) {
23-
const oldChar = chars[i]
24-
for (let c = 97; c <= 122; c++) {
25-
chars[i] = String.fromCharCode(c)
26-
const nextWord = chars.join('')
27-
if (endSet.has(nextWord)) {
28-
return len + 1
29-
}
30-
if (!visited.has(nextWord) && wordSet.has(nextWord)) {
31-
tempSet.add(nextWord)
32-
visited.add(nextWord)
6+
const wordSet = new Set(wordList)
7+
if (!wordSet.has(endWord)) return 0
8+
9+
const queue = [beginWord]
10+
let steps = 1
11+
12+
while (queue.length > 0) {
13+
const levelSize = queue.length
14+
15+
for (let i = 0; i < levelSize; i++) {
16+
const word = queue.shift()!
17+
18+
// Try changing each letter
19+
for (let pos = 0; pos < word.length; pos++) {
20+
for (let charCode = 97; charCode <= 122; charCode++) {
21+
// 'a' to 'z'
22+
const newChar = String.fromCodePoint(charCode)
23+
if (newChar === word[pos]) continue
24+
25+
const newWord = word.slice(0, pos) + newChar + word.slice(pos + 1)
26+
27+
if (newWord === endWord) return steps + 1
28+
29+
if (wordSet.has(newWord)) {
30+
queue.push(newWord)
31+
wordSet.delete(newWord)
3332
}
3433
}
35-
chars[i] = oldChar
3634
}
3735
}
38-
beginSet = tempSet
39-
len++
36+
37+
steps++
4038
}
39+
4140
return 0
4241
}
4342

src/main/ts/g0101_0200/s0130_surrounded_regions/solution.ts

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,47 +6,42 @@
66
Do not return anything, modify board in-place instead.
77
*/
88
function solve(board: string[][]): void {
9-
if (board.length === 0) {
10-
return
11-
}
9+
if (!board.length) return
10+
1211
const rows = board.length
1312
const cols = board[0].length
14-
const dfs = (board: string[][], row: number, col: number): void => {
15-
if (row < 0 || row >= rows || col < 0 || col >= cols || board[row][col] !== 'O') {
16-
return
17-
}
18-
board[row][col] = '#'
19-
dfs(board, row + 1, col)
20-
dfs(board, row - 1, col)
21-
dfs(board, row, col + 1)
22-
dfs(board, row, col - 1)
23-
}
24-
for (let i = 0; i < cols; i++) {
25-
if (board[0][i] === 'O') {
26-
dfs(board, 0, i)
27-
}
28-
if (board[rows - 1][i] === 'O') {
29-
dfs(board, rows - 1, i)
13+
const dirs = [[1,0], [-1,0], [0,1], [0,-1]]
14+
15+
const dfs = (r: number, c: number): void => {
16+
if (
17+
r < 0 || r >= rows ||
18+
c < 0 || c >= cols ||
19+
board[r][c] !== 'O'
20+
) return
21+
22+
board[r][c] = '#'
23+
for (const [dr, dc] of dirs) {
24+
dfs(r + dr, c + dc)
3025
}
3126
}
27+
28+
// mark border-connected O's
3229
for (let i = 0; i < rows; i++) {
33-
if (board[i][0] === 'O') {
34-
dfs(board, i, 0)
35-
}
36-
if (board[i][cols - 1] === 'O') {
37-
dfs(board, i, cols - 1)
38-
}
30+
dfs(i, 0)
31+
dfs(i, cols - 1)
3932
}
33+
for (let j = 0; j < cols; j++) {
34+
dfs(0, j)
35+
dfs(rows - 1, j)
36+
}
37+
38+
// flip & restore
4039
for (let i = 0; i < rows; i++) {
4140
for (let j = 0; j < cols; j++) {
42-
if (board[i][j] === 'O') {
43-
board[i][j] = 'X'
44-
}
45-
if (board[i][j] === '#') {
46-
board[i][j] = 'O'
47-
}
41+
board[i][j] = board[i][j] === '#' ? 'O' : 'X'
4842
}
4943
}
5044
}
5145

46+
5247
export { solve }

src/main/ts/g0101_0200/s0138_copy_list_with_random_pointer/solution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const copyRandomList = (head: Node | null): Node | null => {
3838
while (cursor !== null && newCursor !== null) {
3939
if (cursor.random !== null) {
4040
const targetNode = map.get(cursor.random)
41-
if (typeof targetNode !== 'undefined') {
41+
if (targetNode !== undefined) {
4242
newCursor.random = targetNode
4343
}
4444
}

src/main/ts/g0101_0200/s0173_binary_search_tree_iterator/solution.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ class BSTIterator {
2727
next(): number {
2828
let res = -1
2929
while (this.node !== null) {
30-
if (this.node.left !== null) {
30+
if (this.node.left === null) {
31+
res = this.node.val
32+
this.node = this.node.right
33+
return res
34+
} else {
3135
let rightMost = this.node.left
3236
while (rightMost.right !== null && rightMost.right !== this.node) {
3337
rightMost = rightMost.right
@@ -42,10 +46,6 @@ class BSTIterator {
4246
this.node = this.node.right
4347
return res
4448
}
45-
} else {
46-
res = this.node.val
47-
this.node = this.node.right
48-
return res
4949
}
5050
}
5151
return res

0 commit comments

Comments
 (0)