Skip to content

Commit b8ead96

Browse files
committed
feat: add solutions to lc problem: No.1128
No.1128.Number of Equivalent Domino Pairs
1 parent 3ba0480 commit b8ead96

File tree

7 files changed

+100
-113
lines changed

7 files changed

+100
-113
lines changed

solution/1100-1199/1125.Smallest Sufficient Team/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@
6666
- 数组 $g[i]$ 表示掌握技能集合为 $i$ 的最少人数时,最后一个人的编号。
6767
- 数组 $h[i]$ 表示掌握技能集合为 $i$ 的最少人数时,上一个技能集合状态。
6868

69-
我们在 $[0,..2^m-1]$ 的范围内枚举每个技能集合,对于每个技能集合 $i$,我们枚举 `people` 中的每个人,如果 $f[i] + 1 \lt f[i | p[j]]$,说明 $f[i | p[j]]$ 可以通过 $f[i]$ 转移得到,此时,我们更新 $f[i | p[j]]$ 为 $f[i] + 1$,并将 $g[i | p[j]]$ 更新为 $j$,同时将 $h[i | p[j]]$ 更新为 $i$。即当前技能集合状态为 $i | p[j]$ 时,最后一个人的编号为 $j$,上一个技能集合状态为 $i$。这里符号 $|$ 表示按位或运算。
69+
我们在 $[0,..2^m-1]$ 的范围内枚举每个技能集合,对于每个技能集合 $i$:
70+
71+
我们枚举 `people` 中的每个人 $j$,如果 $f[i] + 1 \lt f[i | p[j]]$,说明 $f[i | p[j]]$ 可以通过 $f[i]$ 转移得到,此时,我们更新 $f[i | p[j]]$ 为 $f[i] + 1$,并将 $g[i | p[j]]$ 更新为 $j$,同时将 $h[i | p[j]]$ 更新为 $i$。即当前技能集合状态为 $i | p[j]$ 时,最后一个人的编号为 $j$,上一个技能集合状态为 $i$。这里符号 $|$ 表示按位或运算。
7072

7173
最后,我们从技能集合 $i=2^m-1$ 开始,找到此时最后一个人的编号 $g[i]$,将其加入答案中,然后将 $i$ 更新为 $h[i]$,不断地向前回溯,直到 $i=0$,即可得到最小的必要团队中的人员编号。
7274

solution/1100-1199/1128.Number of Equivalent Domino Pairs/README.md

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@
3535

3636
<!-- 这里可写通用的实现逻辑 -->
3737

38+
**方法一:计数**
39+
40+
我们可以将每个多米诺骨牌的两个数字按照大小顺序拼接成一个两位数,这样就可以将等价的多米诺骨牌拼接成相同的两位数。例如,`[1, 2]``[2, 1]` 拼接成的两位数都是 `12``[3, 4]``[4, 3]` 拼接成的两位数都是 `34`
41+
42+
然后我们遍历所有的多米诺骨牌,用一个长度为 $100$ 的数组 $cnt$ 记录每个两位数出现的次数。对于每个多米诺骨牌,我们拼接成的两位数为 $x$,那么答案就会增加 $cnt[x]$,接着我们将 $cnt[x]$ 的值加 $1$。继续遍历下一个多米诺骨牌,就可以统计出所有等价的多米诺骨牌对的数量。
43+
44+
时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 是多米诺骨牌的数量,而 $C$ 是多米诺骨牌中拼接成的两位数的最大数量,即 $100$。
45+
3846
<!-- tabs:start -->
3947

4048
### **Python3**
@@ -44,12 +52,25 @@
4452
```python
4553
class Solution:
4654
def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
47-
counter = Counter()
55+
cnt = Counter()
56+
ans = 0
57+
for a, b in dominoes:
58+
ans += cnt[(a, b)]
59+
cnt[(a, b)] += 1
60+
if a != b:
61+
cnt[(b, a)] += 1
62+
return ans
63+
```
64+
65+
```python
66+
class Solution:
67+
def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
68+
cnt = Counter()
4869
ans = 0
4970
for a, b in dominoes:
50-
v = a * 10 + b if a > b else b * 10 + a
51-
ans += counter[v]
52-
counter[v] += 1
71+
x = a * 10 + b if a < b else b * 10 + a
72+
ans += cnt[x]
73+
cnt[x] += 1
5374
return ans
5475
```
5576

@@ -60,29 +81,11 @@ class Solution:
6081
```java
6182
class Solution {
6283
public int numEquivDominoPairs(int[][] dominoes) {
84+
int[] cnt = new int[100];
6385
int ans = 0;
64-
int[] counter = new int[100];
65-
for (int[] d : dominoes) {
66-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
67-
ans += counter[v];
68-
++counter[v];
69-
}
70-
return ans;
71-
}
72-
}
73-
```
74-
75-
```java
76-
class Solution {
77-
public int numEquivDominoPairs(int[][] dominoes) {
78-
int[] counter = new int[100];
79-
for (int[] d : dominoes) {
80-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
81-
++counter[v];
82-
}
83-
int ans = 0;
84-
for (int c : counter) {
85-
ans += c * (c - 1) / 2;
86+
for (var e : dominoes) {
87+
int x = e[0] < e[1] ? e[0] * 10 + e[1] : e[1] * 10 + e[0];
88+
ans += cnt[x]++;
8689
}
8790
return ans;
8891
}
@@ -95,12 +98,11 @@ class Solution {
9598
class Solution {
9699
public:
97100
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
98-
vector<int> counter(100);
101+
int cnt[100]{};
99102
int ans = 0;
100-
for (auto& d : dominoes) {
101-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
102-
ans += counter[v];
103-
++counter[v];
103+
for (auto& e : dominoes) {
104+
int x = e[0] < e[1] ? e[0] * 10 + e[1] : e[1] * 10 + e[0];
105+
ans += cnt[x]++;
104106
}
105107
return ans;
106108
}
@@ -110,20 +112,17 @@ public:
110112
### **Go**
111113
112114
```go
113-
func numEquivDominoPairs(dominoes [][]int) int {
114-
counter := make([]int, 100)
115-
for _, d := range dominoes {
116-
if d[1] < d[0] {
117-
d[0], d[1] = d[1], d[0]
115+
func numEquivDominoPairs(dominoes [][]int) (ans int) {
116+
cnt := [100]int{}
117+
for _, e := range dominoes {
118+
x := e[0]*10 + e[1]
119+
if e[0] > e[1] {
120+
x = e[1]*10 + e[0]
118121
}
119-
v := d[0]*10 + d[1]
120-
counter[v]++
121-
}
122-
ans := 0
123-
for _, c := range counter {
124-
ans += c * (c - 1) / 2
122+
ans += cnt[x]
123+
cnt[x]++
125124
}
126-
return ans
125+
return
127126
}
128127
```
129128

solution/1100-1199/1128.Number of Equivalent Domino Pairs/README_EN.md

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -41,43 +41,38 @@
4141
```python
4242
class Solution:
4343
def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
44-
counter = Counter()
44+
cnt = Counter()
4545
ans = 0
4646
for a, b in dominoes:
47-
v = a * 10 + b if a > b else b * 10 + a
48-
ans += counter[v]
49-
counter[v] += 1
47+
ans += cnt[(a, b)]
48+
cnt[(a, b)] += 1
49+
if a != b:
50+
cnt[(b, a)] += 1
5051
return ans
5152
```
5253

53-
### **Java**
54-
55-
```java
56-
class Solution {
57-
public int numEquivDominoPairs(int[][] dominoes) {
58-
int ans = 0;
59-
int[] counter = new int[100];
60-
for (int[] d : dominoes) {
61-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
62-
ans += counter[v];
63-
++counter[v];
64-
}
65-
return ans;
66-
}
67-
}
54+
```python
55+
class Solution:
56+
def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
57+
cnt = Counter()
58+
ans = 0
59+
for a, b in dominoes:
60+
x = a * 10 + b if a < b else b * 10 + a
61+
ans += cnt[x]
62+
cnt[x] += 1
63+
return ans
6864
```
6965

66+
### **Java**
67+
7068
```java
7169
class Solution {
7270
public int numEquivDominoPairs(int[][] dominoes) {
73-
int[] counter = new int[100];
74-
for (int[] d : dominoes) {
75-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
76-
++counter[v];
77-
}
71+
int[] cnt = new int[100];
7872
int ans = 0;
79-
for (int c : counter) {
80-
ans += c * (c - 1) / 2;
73+
for (var e : dominoes) {
74+
int x = e[0] < e[1] ? e[0] * 10 + e[1] : e[1] * 10 + e[0];
75+
ans += cnt[x]++;
8176
}
8277
return ans;
8378
}
@@ -90,12 +85,11 @@ class Solution {
9085
class Solution {
9186
public:
9287
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
93-
vector<int> counter(100);
88+
int cnt[100]{};
9489
int ans = 0;
95-
for (auto& d : dominoes) {
96-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
97-
ans += counter[v];
98-
++counter[v];
90+
for (auto& e : dominoes) {
91+
int x = e[0] < e[1] ? e[0] * 10 + e[1] : e[1] * 10 + e[0];
92+
ans += cnt[x]++;
9993
}
10094
return ans;
10195
}
@@ -105,20 +99,17 @@ public:
10599
### **Go**
106100
107101
```go
108-
func numEquivDominoPairs(dominoes [][]int) int {
109-
counter := make([]int, 100)
110-
for _, d := range dominoes {
111-
if d[1] < d[0] {
112-
d[0], d[1] = d[1], d[0]
102+
func numEquivDominoPairs(dominoes [][]int) (ans int) {
103+
cnt := [100]int{}
104+
for _, e := range dominoes {
105+
x := e[0]*10 + e[1]
106+
if e[0] > e[1] {
107+
x = e[1]*10 + e[0]
113108
}
114-
v := d[0]*10 + d[1]
115-
counter[v]++
116-
}
117-
ans := 0
118-
for _, c := range counter {
119-
ans += c * (c - 1) / 2
109+
ans += cnt[x]
110+
cnt[x]++
120111
}
121-
return ans
112+
return
122113
}
123114
```
124115

solution/1100-1199/1128.Number of Equivalent Domino Pairs/Solution.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
class Solution {
22
public:
33
int numEquivDominoPairs(vector<vector<int>>& dominoes) {
4-
vector<int> counter(100);
4+
int cnt[100]{};
55
int ans = 0;
6-
for (auto& d : dominoes) {
7-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
8-
ans += counter[v];
9-
++counter[v];
6+
for (auto& e : dominoes) {
7+
int x = e[0] < e[1] ? e[0] * 10 + e[1] : e[1] * 10 + e[0];
8+
ans += cnt[x]++;
109
}
1110
return ans;
1211
}
Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
func numEquivDominoPairs(dominoes [][]int) int {
2-
counter := make([]int, 100)
3-
for _, d := range dominoes {
4-
if d[1] < d[0] {
5-
d[0], d[1] = d[1], d[0]
1+
func numEquivDominoPairs(dominoes [][]int) (ans int) {
2+
cnt := [100]int{}
3+
for _, e := range dominoes {
4+
x := e[0]*10 + e[1]
5+
if e[0] > e[1] {
6+
x = e[1]*10 + e[0]
67
}
7-
v := d[0]*10 + d[1]
8-
counter[v]++
8+
ans += cnt[x]
9+
cnt[x]++
910
}
10-
ans := 0
11-
for _, c := range counter {
12-
ans += c * (c - 1) / 2
13-
}
14-
return ans
11+
return
1512
}

solution/1100-1199/1128.Number of Equivalent Domino Pairs/Solution.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
class Solution {
22
public int numEquivDominoPairs(int[][] dominoes) {
3+
int[] cnt = new int[100];
34
int ans = 0;
4-
int[] counter = new int[100];
5-
for (int[] d : dominoes) {
6-
int v = d[0] > d[1] ? d[0] * 10 + d[1] : d[1] * 10 + d[0];
7-
ans += counter[v];
8-
++counter[v];
5+
for (var e : dominoes) {
6+
int x = e[0] < e[1] ? e[0] * 10 + e[1] : e[1] * 10 + e[0];
7+
ans += cnt[x]++;
98
}
109
return ans;
1110
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class Solution:
22
def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
3-
counter = Counter()
3+
cnt = Counter()
44
ans = 0
55
for a, b in dominoes:
6-
v = a * 10 + b if a > b else b * 10 + a
7-
ans += counter[v]
8-
counter[v] += 1
6+
x = a * 10 + b if a < b else b * 10 + a
7+
ans += cnt[x]
8+
cnt[x] += 1
99
return ans

0 commit comments

Comments
 (0)