-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path1128-number-of-equivalent-domino-pairs.js
128 lines (99 loc) · 3.24 KB
/
1128-number-of-equivalent-domino-pairs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// 1128. Number of Equivalent Domino Pairs
// https://leetcode.com/problems/number-of-equivalent-domino-pairs/
/*
Given a list of dominoes, dominoes[i] = [a, b] is equivalent to dominoes[j] =
[c, d] if and only if either (a==c and b==d), or (a==d and b==c) - that is, one
domino can be rotated to be equal to another domino.
Return the number of pairs (i, j) for which 0 <= i < j < dominoes.length, and
dominoes[i] is equivalent to dominoes[j].
Constraints:
- 1 <= dominoes.length <= 40000
- 1 <= dominoes[i][j] <= 9
*/
import { strictEqual } from 'assert';
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// /**
// * @param {number[][]} dominoes
// * @return {number}
// */
// const numEquivDominoPairs = dominoes =>
// dominoes.reduce(
// (acc, curr, idx) =>
// idx === dominoes.length - 1
// ? acc
// : Math.min(...curr) === Math.min(...dominoes[idx + 1]) &&
// Math.max(...curr) === Math.max(...dominoes[idx + 1])
// ? acc + 1
// : acc,
// 0,
// );
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// /**
// * @param {number[][]} dominoes
// * @return {number}
// */
// const numEquivDominoPairs = dominoes =>
// [dominoes.map(a => Number(`${Math.min(...a)}${Math.max(...a)}`))].reduce(
// (_acc, _curr, _idx, a) => a[0].length - new Set(a[0]).size,
// 0,
// );
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Runtime: 72 ms, faster than 82.99% of JavaScript online submissions
// Memory Usage: 41.8 MB, less than 100.00% of JavaScript online submissions
// /**
// * @param {number[][]} dominoes
// * @return {number}
// */
// const numEquivDominoPairs = dominoes => {
// const nums = dominoes.map(a => Number(`${Math.min(...a)}${Math.max(...a)}`));
// const cnts = new Array(100).fill(0);
// for (const num of nums) cnts[num]++;
// return cnts.reduce((acc, curr) => acc + ((curr - 1) * curr) / 2, 0);
// };
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Runtime: 64 ms, faster than 97.42% of JavaScript online submissions
// Memory Usage: 42.1 MB, less than 100.00% of JavaScript online submissions
/**
* @param {number[][]} dominoes
* @return {number}
*/
const numEquivDominoPairs = dominoes => {
const cnts = new Array(100).fill(0);
for (const d of dominoes) cnts[+`${Math.min(...d)}${Math.max(...d)}`]++;
return cnts.reduce((acc, curr) => acc + ((curr - 1) * curr) / 2, 0);
};
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Example 1:
strictEqual(
numEquivDominoPairs([
[1, 2],
[2, 1],
[3, 4],
[5, 6],
]),
1,
);
strictEqual(
numEquivDominoPairs([
[1, 2],
[1, 2],
[1, 1],
[1, 2],
[2, 2],
]),
3,
);
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
/*
12, 12, 33, 44, 55 => 12, 33, 44, 55 = 1
12, 12, 12, 33, 44, => 12, 33, 44 = 3
12, 12, 12, 33, 33, => 12, 33 = 4
12, 12, 33, 33, 44 => 12, 33, 44 = 2
12, 12, 33, 33, 44, 44, 44 => 12, 33, 44 = 5
// =-=-=-=
11 = 0 = 0 * (0 + 1) / 2
11, 11 = 1 = 1 * (1 + 1) / 2
11, 11, 11 = 3 = 2 * (2 + 1) / 2
11, 11, 11, 11 = 6 = 3 * (3 + 1) / 2
11, 11, 11, 11, 11 = 10 = 4 * (4 + 1) / 2
*/