Skip to content

Commit bd5f310

Browse files
committed
0947 solved.
1 parent a8c3a1f commit bd5f310

File tree

4 files changed

+166
-0
lines changed

4 files changed

+166
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cmake_minimum_required(VERSION 3.12)
2+
project(C)
3+
4+
set(CMAKE_CXX_STANDARD 11)
5+
6+
add_executable(C main2.cpp)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/// Source : https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/
2+
/// Author : liuyubobobo
3+
/// Time : 2018-11-25
4+
5+
#include <iostream>
6+
#include <vector>
7+
#include <unordered_set>
8+
9+
using namespace std;
10+
11+
12+
/// Using DFS to calculate connected components
13+
/// Time Complexity: O(n)
14+
/// Space Complexity: O(n)
15+
class Solution {
16+
public:
17+
int removeStones(vector<vector<int>>& stones) {
18+
19+
int n = stones.size();
20+
vector<unordered_set<int>> g(n);
21+
for(int i = 0; i < n; i ++)
22+
for(int j = i + 1; j < n; j ++)
23+
if(stones[i][0] == stones[j][0] || stones[i][1] == stones[j][1]){
24+
g[i].insert(j);
25+
g[j].insert(i);
26+
}
27+
28+
int res = 0;
29+
vector<bool> visited(n, false);
30+
for(int i = 0; i < n; i ++)
31+
if(!visited[i])
32+
res += dfs(g, i, visited) - 1;
33+
34+
return res;
35+
}
36+
37+
private:
38+
int dfs(const vector<unordered_set<int>> &g, int v, vector<bool> &visited){
39+
40+
visited[v] = true;
41+
int res = 1;
42+
for(int next: g[v])
43+
if(!visited[next])
44+
res += dfs(g, next, visited);
45+
return res;
46+
}
47+
};
48+
49+
50+
int main() {
51+
52+
vector<vector<int>> stones1 = {{0,0},{0,1},{1,0},{1,2},{2,1},{2,2}};
53+
cout << Solution().removeStones(stones1) << endl;
54+
// 5
55+
56+
vector<vector<int>> stones2 = {{0,0},{0,2},{1,1},{2,0},{2,2}};
57+
cout << Solution().removeStones(stones2) << endl;
58+
// 3
59+
60+
vector<vector<int>> stones3 = {{0,0}};
61+
cout << Solution().removeStones(stones3) << endl;
62+
// 0
63+
64+
return 0;
65+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/// Source : https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/
2+
/// Author : liuyubobobo
3+
/// Time : 2018-11-25
4+
5+
#include <iostream>
6+
#include <vector>
7+
#include <unordered_set>
8+
9+
using namespace std;
10+
11+
12+
/// Using Union-Find to calculate connected components
13+
/// Time Complexity: O(n)
14+
/// Space Complexity: O(n)
15+
class UF{
16+
17+
private:
18+
vector<int> parent, sz;
19+
20+
public:
21+
UF(int n): sz(n, 1){
22+
for(int i = 0 ; i < n ; i ++)
23+
parent.push_back(i);
24+
}
25+
26+
int find(int p){
27+
if(p != parent[p])
28+
parent[p] = find(parent[p]);
29+
return parent[p];
30+
}
31+
32+
bool isConnected(int p , int q){
33+
return find(p) == find(q);
34+
}
35+
36+
void unionElements(int p, int q){
37+
38+
int pRoot = find(p);
39+
int qRoot = find(q);
40+
41+
if( pRoot == qRoot )
42+
return;
43+
44+
parent[pRoot] = qRoot;
45+
sz[qRoot] += sz[pRoot];
46+
}
47+
48+
int size(int p){
49+
return sz[find(p)];
50+
}
51+
};
52+
53+
class Solution {
54+
public:
55+
int removeStones(vector<vector<int>>& stones) {
56+
57+
int n = stones.size();
58+
UF uf(n);
59+
for(int i = 0; i < n; i ++)
60+
for(int j = i + 1; j < n; j ++)
61+
if(stones[i][0] == stones[j][0] || stones[i][1] == stones[j][1])
62+
uf.unionElements(i, j);
63+
64+
int res = 0;
65+
unordered_set<int> groups;
66+
for(int i = 0; i < n; i ++){
67+
int group = uf.find(i);
68+
if(!groups.count(group)){
69+
res += uf.size(i) - 1;
70+
groups.insert(group);
71+
}
72+
}
73+
74+
return res;
75+
}
76+
};
77+
78+
79+
int main() {
80+
81+
vector<vector<int>> stones1 = {{0,0},{0,1},{1,0},{1,2},{2,1},{2,2}};
82+
cout << Solution().removeStones(stones1) << endl;
83+
// 5
84+
85+
vector<vector<int>> stones2 = {{0,0},{0,2},{1,1},{2,0},{2,2}};
86+
cout << Solution().removeStones(stones2) << endl;
87+
// 3
88+
89+
vector<vector<int>> stones3 = {{0,0}};
90+
cout << Solution().removeStones(stones3) << endl;
91+
// 0
92+
93+
return 0;
94+
}

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,4 +603,5 @@ email: [liuyubobobo@gmail.com](mailto:liuyubobobo@gmail.com)
603603
| 944 | [Delete Columns to Make Sorted](https://leetcode.com/problems/delete-columns-to-make-sorted/) | [solution](https://leetcode.com/problems/delete-columns-to-make-sorted/solution/) | [C++](0944-Delete-Columns-to-Make-Sorted/cpp-0944/) | | |
604604
| 945 | [Minimum Increment to Make Array Unique](https://leetcode.com/problems/minimum-increment-to-make-array-unique/) | [solution](https://leetcode.com/problems/minimum-increment-to-make-array-unique/solution/) | [C++](0945-Minimum-Increment-to-Make-Array-Unique/cpp-0945/) | | |
605605
| 946 | [Validate Stack Sequences](https://leetcode.com/problems/validate-stack-sequences/) | [solution](https://leetcode.com/problems/validate-stack-sequences/solution/) | [C++](0946-Validate-Stack-Sequences/cpp-0946/) | | |
606+
| 947 | [Most Stones Removed with Same Row or Column](https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/) | [solution](https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/solution/) | [C++](0947-Most-Stones-Removed-with-Same-Row-or-Column/cpp-0947/) | | |
606607
| | | | | | |

0 commit comments

Comments
 (0)