Skip to content

Commit 8093717

Browse files
committed
feat: add solutions to lc problem: No.0947
No.0947.Most Stones Removed with Same Row or Column
1 parent 4b6b486 commit 8093717

File tree

6 files changed

+77
-116
lines changed

6 files changed

+77
-116
lines changed

Diff for: solution/0900-0999/0947.Most Stones Removed with Same Row or Column/README.md

+27-40
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62-
并查集。
62+
并查集。对于本题,`可以移除的石头数量 = 石头总数 - 连通分量个数`。遍历 `stones` 数组,将每个 `stone` 的横、纵坐标进行合并。需要注意的是,横、纵坐标数值可能相同,我们需要处理成不同的值,结合横、纵坐标的范围,我们只需要在其中一个坐标值加上 10010 即可。
6363

64-
并查集模板:
64+
以下是并查集的几个常用模板。
6565

6666
模板 1——朴素并查集:
6767

@@ -129,20 +129,17 @@ d[find(a)] = distance
129129
```python
130130
class Solution:
131131
def removeStones(self, stones: List[List[int]]) -> int:
132-
n = 10010
133-
p = list(range(n << 1))
134-
135132
def find(x):
136133
if p[x] != x:
137134
p[x] = find(p[x])
138135
return p[x]
139136

137+
n = 10010
138+
p = list(range(n << 1))
140139
for x, y in stones:
141140
p[find(x)] = find(y + n)
142141

143-
s = set()
144-
for x, _ in stones:
145-
s.add(find(x))
142+
s = {find(x) for x, _ in stones}
146143
return len(stones) - len(s)
147144
```
148145

@@ -160,12 +157,12 @@ class Solution {
160157
for (int i = 0; i < p.length; ++i) {
161158
p[i] = i;
162159
}
163-
for (int[] e : stones) {
164-
p[find(e[0])] = find(e[1] + n);
160+
for (int[] stone : stones) {
161+
p[find(stone[0])] = find(stone[1] + n);
165162
}
166163
Set<Integer> s = new HashSet<>();
167-
for (int[] e : stones) {
168-
s.add(find(e[0]));
164+
for (int[] stone : stones) {
165+
s.add(find(stone[0]));
169166
}
170167
return stones.length - s.size();
171168
}
@@ -186,26 +183,18 @@ class Solution {
186183
public:
187184
vector<int> p;
188185

189-
int removeStones(vector<vector<int>> &stones) {
186+
int removeStones(vector<vector<int>>& stones) {
190187
int n = 10010;
191188
p.resize(n << 1);
192-
for (int i = 0; i < p.size(); ++i)
193-
p[i] = i;
194-
for (auto e : stones)
195-
{
196-
p[find(e[0])] = find(e[1] + 10010);
197-
}
189+
for (int i = 0; i < p.size(); ++i) p[i] = i;
190+
for (auto& stone : stones) p[find(stone[0])] = find(stone[1] + n);
198191
unordered_set<int> s;
199-
for (auto e : stones)
200-
{
201-
s.insert(find(e[0]));
202-
}
192+
for (auto& stone : stones) s.insert(find(stone[0]));
203193
return stones.size() - s.size();
204194
}
205195

206196
int find(int x) {
207-
if (p[x] != x)
208-
p[x] = find(p[x]);
197+
if (p[x] != x) p[x] = find(p[x]);
209198
return p[x];
210199
}
211200
};
@@ -214,30 +203,28 @@ public:
214203
### **Go**
215204
216205
```go
217-
var p []int
218-
219206
func removeStones(stones [][]int) int {
220207
n := 10010
221-
p = make([]int, n<<1)
222-
for i := 0; i < len(p); i++ {
208+
p := make([]int, n<<1)
209+
for i := range p {
223210
p[i] = i
224211
}
225-
for _, e := range stones {
226-
p[find(e[0])] = find(e[1] + n)
212+
var find func(x int) int
213+
find = func(x int) int {
214+
if p[x] != x {
215+
p[x] = find(p[x])
216+
}
217+
return p[x]
218+
}
219+
for _, stone := range stones {
220+
p[find(stone[0])] = find(stone[1] + n)
227221
}
228222
s := make(map[int]bool)
229-
for _, e := range stones {
230-
s[find(e[0])] = true
223+
for _, stone := range stones {
224+
s[find(stone[0])] = true
231225
}
232226
return len(stones) - len(s)
233227
}
234-
235-
func find(x int) int {
236-
if p[x] != x {
237-
p[x] = find(p[x])
238-
}
239-
return p[x]
240-
}
241228
```
242229

243230
### **...**

Diff for: solution/0900-0999/0947.Most Stones Removed with Same Row or Column/README_EN.md

+25-38
Original file line numberDiff line numberDiff line change
@@ -63,20 +63,17 @@ Stones [0,0] and [1,1] cannot be removed since they do not share a row/column wi
6363
```python
6464
class Solution:
6565
def removeStones(self, stones: List[List[int]]) -> int:
66-
n = 10010
67-
p = list(range(n << 1))
68-
6966
def find(x):
7067
if p[x] != x:
7168
p[x] = find(p[x])
7269
return p[x]
7370

71+
n = 10010
72+
p = list(range(n << 1))
7473
for x, y in stones:
7574
p[find(x)] = find(y + n)
7675

77-
s = set()
78-
for x, _ in stones:
79-
s.add(find(x))
76+
s = {find(x) for x, _ in stones}
8077
return len(stones) - len(s)
8178
```
8279

@@ -92,12 +89,12 @@ class Solution {
9289
for (int i = 0; i < p.length; ++i) {
9390
p[i] = i;
9491
}
95-
for (int[] e : stones) {
96-
p[find(e[0])] = find(e[1] + n);
92+
for (int[] stone : stones) {
93+
p[find(stone[0])] = find(stone[1] + n);
9794
}
9895
Set<Integer> s = new HashSet<>();
99-
for (int[] e : stones) {
100-
s.add(find(e[0]));
96+
for (int[] stone : stones) {
97+
s.add(find(stone[0]));
10198
}
10299
return stones.length - s.size();
103100
}
@@ -118,26 +115,18 @@ class Solution {
118115
public:
119116
vector<int> p;
120117

121-
int removeStones(vector<vector<int>> &stones) {
118+
int removeStones(vector<vector<int>>& stones) {
122119
int n = 10010;
123120
p.resize(n << 1);
124-
for (int i = 0; i < p.size(); ++i)
125-
p[i] = i;
126-
for (auto e : stones)
127-
{
128-
p[find(e[0])] = find(e[1] + 10010);
129-
}
121+
for (int i = 0; i < p.size(); ++i) p[i] = i;
122+
for (auto& stone : stones) p[find(stone[0])] = find(stone[1] + n);
130123
unordered_set<int> s;
131-
for (auto e : stones)
132-
{
133-
s.insert(find(e[0]));
134-
}
124+
for (auto& stone : stones) s.insert(find(stone[0]));
135125
return stones.size() - s.size();
136126
}
137127

138128
int find(int x) {
139-
if (p[x] != x)
140-
p[x] = find(p[x]);
129+
if (p[x] != x) p[x] = find(p[x]);
141130
return p[x];
142131
}
143132
};
@@ -146,30 +135,28 @@ public:
146135
### **Go**
147136
148137
```go
149-
var p []int
150-
151138
func removeStones(stones [][]int) int {
152139
n := 10010
153-
p = make([]int, n<<1)
154-
for i := 0; i < len(p); i++ {
140+
p := make([]int, n<<1)
141+
for i := range p {
155142
p[i] = i
156143
}
157-
for _, e := range stones {
158-
p[find(e[0])] = find(e[1] + n)
144+
var find func(x int) int
145+
find = func(x int) int {
146+
if p[x] != x {
147+
p[x] = find(p[x])
148+
}
149+
return p[x]
150+
}
151+
for _, stone := range stones {
152+
p[find(stone[0])] = find(stone[1] + n)
159153
}
160154
s := make(map[int]bool)
161-
for _, e := range stones {
162-
s[find(e[0])] = true
155+
for _, stone := range stones {
156+
s[find(stone[0])] = true
163157
}
164158
return len(stones) - len(s)
165159
}
166-
167-
func find(x int) int {
168-
if p[x] != x {
169-
p[x] = find(p[x])
170-
}
171-
return p[x]
172-
}
173160
```
174161

175162
### **...**

Diff for: solution/0900-0999/0947.Most Stones Removed with Same Row or Column/Solution.cpp

+5-13
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,18 @@ class Solution {
22
public:
33
vector<int> p;
44

5-
int removeStones(vector<vector<int>> &stones) {
5+
int removeStones(vector<vector<int>>& stones) {
66
int n = 10010;
77
p.resize(n << 1);
8-
for (int i = 0; i < p.size(); ++i)
9-
p[i] = i;
10-
for (auto e : stones)
11-
{
12-
p[find(e[0])] = find(e[1] + 10010);
13-
}
8+
for (int i = 0; i < p.size(); ++i) p[i] = i;
9+
for (auto& stone : stones) p[find(stone[0])] = find(stone[1] + n);
1410
unordered_set<int> s;
15-
for (auto e : stones)
16-
{
17-
s.insert(find(e[0]));
18-
}
11+
for (auto& stone : stones) s.insert(find(stone[0]));
1912
return stones.size() - s.size();
2013
}
2114

2215
int find(int x) {
23-
if (p[x] != x)
24-
p[x] = find(p[x]);
16+
if (p[x] != x) p[x] = find(p[x]);
2517
return p[x];
2618
}
2719
};
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
1-
var p []int
2-
31
func removeStones(stones [][]int) int {
42
n := 10010
5-
p = make([]int, n<<1)
6-
for i := 0; i < len(p); i++ {
3+
p := make([]int, n<<1)
4+
for i := range p {
75
p[i] = i
86
}
9-
for _, e := range stones {
10-
p[find(e[0])] = find(e[1] + n)
7+
var find func(x int) int
8+
find = func(x int) int {
9+
if p[x] != x {
10+
p[x] = find(p[x])
11+
}
12+
return p[x]
13+
}
14+
for _, stone := range stones {
15+
p[find(stone[0])] = find(stone[1] + n)
1116
}
1217
s := make(map[int]bool)
13-
for _, e := range stones {
14-
s[find(e[0])] = true
18+
for _, stone := range stones {
19+
s[find(stone[0])] = true
1520
}
1621
return len(stones) - len(s)
17-
}
18-
19-
func find(x int) int {
20-
if p[x] != x {
21-
p[x] = find(p[x])
22-
}
23-
return p[x]
2422
}

Diff for: solution/0900-0999/0947.Most Stones Removed with Same Row or Column/Solution.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ public int removeStones(int[][] stones) {
77
for (int i = 0; i < p.length; ++i) {
88
p[i] = i;
99
}
10-
for (int[] e : stones) {
11-
p[find(e[0])] = find(e[1] + n);
10+
for (int[] stone : stones) {
11+
p[find(stone[0])] = find(stone[1] + n);
1212
}
1313
Set<Integer> s = new HashSet<>();
14-
for (int[] e : stones) {
15-
s.add(find(e[0]));
14+
for (int[] stone : stones) {
15+
s.add(find(stone[0]));
1616
}
1717
return stones.length - s.size();
1818
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
class Solution:
22
def removeStones(self, stones: List[List[int]]) -> int:
3-
n = 10010
4-
p = list(range(n << 1))
5-
63
def find(x):
74
if p[x] != x:
85
p[x] = find(p[x])
96
return p[x]
107

8+
n = 10010
9+
p = list(range(n << 1))
1110
for x, y in stones:
1211
p[find(x)] = find(y + n)
1312

14-
s = set()
15-
for x, _ in stones:
16-
s.add(find(x))
13+
s = {find(x) for x, _ in stones}
1714
return len(stones) - len(s)

0 commit comments

Comments
 (0)