Skip to content

Commit 83276d5

Browse files
committed
https://leetcode.cn/problems/most-stones-removed-with-same-row-or-column
1 parent 999e4e8 commit 83276d5

File tree

5 files changed

+200
-0
lines changed

5 files changed

+200
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,8 @@ https://leetcode.cn/problems/long-pressed-name/
882882

883883
https://leetcode.cn/problems/three-steps-problem-lcci
884884

885+
https://leetcode.cn/problems/most-stones-removed-with-same-row-or-column
886+
885887
https://leetcode.cn/problems/o8SXZn
886888

887889
https://leetcode.cn/problems/insert-delete-getrandom-o1-duplicates-allowed/
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TreeNode } from "../binary-tree-inorder-traversal/TreeNode.ts";
2+
import { assertEquals } from "../deps.ts";
3+
import levelOrder from "./index.ts";
4+
5+
Deno.test("binary-tree-level-order-traversal", () => {
6+
const root = new TreeNode(3);
7+
root.left = new TreeNode(9);
8+
root.right = new TreeNode(20);
9+
root.right.left = new TreeNode(15);
10+
root.right.right = new TreeNode(7);
11+
const result = levelOrder(root);
12+
assertEquals(result, [[3], [9, 20], [15, 7]]);
13+
14+
assertEquals([[1]], levelOrder(new TreeNode(1)));
15+
assertEquals([], levelOrder(null));
16+
});

complete-binary-tree-inserter/test.ts

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import { assertEquals } from "https://deno.land/[email protected]/testing/asserts.ts";
2+
import { TreeNode } from "../binary-tree-inorder-traversal/TreeNode.ts";
3+
import levelOrder from "../binary-tree-level-order-traversal/index.ts";
4+
import { zip } from "../deps.ts";
5+
import CBTInserter from "./index.ts";
6+
7+
Deno.test("complete-binary-tree-inserter-1", () => {
8+
const root = new TreeNode(1, new TreeNode(2));
9+
const cbt = new CBTInserter(root);
10+
11+
assertEquals(cbt.insert(3), 1);
12+
assertEquals(cbt.insert(4), 2);
13+
14+
assertEquals(
15+
cbt.get_root(),
16+
new TreeNode(1, new TreeNode(2, new TreeNode(4)), new TreeNode(3)),
17+
);
18+
});
19+
Deno.test("complete-binary-tree-inserter-2", () => {
20+
const root = new TreeNode(1, new TreeNode(2));
21+
const cbt = new CBTInserter(root);
22+
23+
assertEquals(cbt.insert(3), 1);
24+
assertEquals(cbt.insert(4), 2);
25+
26+
assertEquals(
27+
cbt.get_root(),
28+
new TreeNode(1, new TreeNode(2, new TreeNode(4)), new TreeNode(3)),
29+
);
30+
assertEquals(cbt.insert(13), 2);
31+
assertEquals(cbt.insert(14), 3);
32+
assertEquals(cbt.insert(213), 3);
33+
assertEquals(cbt.insert(124), 4);
34+
assertEquals(cbt.insert(313), 4);
35+
assertEquals(cbt.insert(134), 13);
36+
assertEquals(
37+
[1, 2, 3, 4, 13, 14, 213, 124, 313, 134],
38+
levelOrder(cbt.get_root()).flat(),
39+
);
40+
});
41+
Deno.test("complete-binary-tree-inserter-3", () => {
42+
const data = zip(
43+
[
44+
"insert",
45+
"insert",
46+
"insert",
47+
"insert",
48+
"insert",
49+
"insert",
50+
"insert",
51+
"insert",
52+
"insert",
53+
"insert",
54+
"insert",
55+
"insert",
56+
"insert",
57+
"insert",
58+
"insert",
59+
],
60+
[
61+
[2],
62+
[3],
63+
[4],
64+
[5],
65+
[6],
66+
[7],
67+
[8],
68+
[9],
69+
[10],
70+
[11],
71+
[12],
72+
[13],
73+
[14],
74+
[15],
75+
[16],
76+
],
77+
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8],
78+
) as [string, number[], number][];
79+
const root = new TreeNode(1);
80+
const cbt = new CBTInserter(root);
81+
for (const [target, args, result] of data) {
82+
assertEquals(
83+
Reflect.apply(Reflect.get(cbt, target), cbt, args),
84+
result,
85+
);
86+
}
87+
assertEquals(
88+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
89+
levelOrder(cbt.get_root()).flat(),
90+
);
91+
});
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
export default function removeStones(stones: [number, number][]): number {
2+
const parent_row = new Map<number, Set<[row: number, col: number]>>();
3+
const parent_col = new Map<number, Set<[row: number, col: number]>>();
4+
5+
function merge(
6+
ar: [row: number, col: number],
7+
rp: Set<[row: number, col: number]>,
8+
) {
9+
parent_row.set(ar[0], rp);
10+
11+
parent_col.set(ar[1], rp);
12+
rp.add(ar);
13+
}
14+
15+
for (const stone of stones) {
16+
const [row, col] = stone;
17+
18+
const rp = parent_row.get(row);
19+
const cp = parent_col.get(col);
20+
21+
if ((parent_row.has(row) || parent_col.has(col)) && rp || cp) {
22+
if (rp === cp && cp && rp) {
23+
merge(stone, rp);
24+
} else {
25+
combine(stone, rp, cp);
26+
}
27+
} else {
28+
create(stone, row, col);
29+
}
30+
}
31+
32+
function create(stone: [number, number], row: number, col: number) {
33+
const set = new Set([stone]);
34+
parent_row.set(row, set);
35+
36+
parent_col.set(col, set);
37+
}
38+
function combine(
39+
stone: [number, number],
40+
rp: Set<[row: number, col: number]> | undefined,
41+
cp: Set<[row: number, col: number]> | undefined,
42+
) {
43+
const series: Set<[row: number, col: number]> = rp || cp || new Set();
44+
45+
cp?.forEach((s) => series.add(s));
46+
rp?.forEach((s) => series.add(s));
47+
merge(stone, series);
48+
49+
series.forEach(([row, col]) => {
50+
parent_col.set(col, series);
51+
parent_row.set(row, series);
52+
});
53+
}
54+
return stones.length -
55+
new Set([...parent_col.values(), ...parent_row.values()]).size;
56+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { assertEquals } from "https://deno.land/[email protected]/testing/asserts.ts";
2+
import removeStones from "./index.ts";
3+
4+
Deno.test("most-stones-removed-with-same-row-or-column", () => {
5+
assertEquals(
6+
5,
7+
removeStones([
8+
[0, 0],
9+
[0, 1],
10+
[1, 0],
11+
[1, 2],
12+
[2, 1],
13+
[2, 2],
14+
]),
15+
);
16+
assertEquals(0, removeStones([[0, 0]]));
17+
assertEquals(
18+
2,
19+
removeStones([
20+
[0, 1],
21+
[1, 0],
22+
[1, 1],
23+
]),
24+
);
25+
assertEquals(
26+
3,
27+
removeStones([
28+
[0, 0],
29+
[0, 2],
30+
[1, 1],
31+
[2, 0],
32+
[2, 2],
33+
]),
34+
);
35+
});

0 commit comments

Comments
 (0)