947. Most Stones Removed with Same Row or Column
On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may have at most one stone.
Now, a move consists of removing a stone that shares a column or row with another stone on the grid.
What is the largest possible number of moves we can make?
Example 1:
Input: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
Output: 5Example 2:
Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
Output: 3Example 3:
Input: stones = [[0,0]]
Output: 0Note:
1 <= stones.length <= 10000 <= stones[i][j] < 10000
// DFS
void dfs(vector<vector<int> >& index, unordered_set<int>& visited, int i) {
if (visited.count(i)) return;
visited.insert(i);
for (int j : index[i]) {
if (visited.count(j)) continue;
dfs(index, visited, j);
}
}
int removeStones(vector<vector<int>>& stones) {
// Trick to differentiate row id and col id
const int k = 10000;
vector<vector<int> > index(2 * k);
for (const vector<int>& stone : stones) {
index[stone[0]].push_back(stone[1] + k);
index[stone[1] + k].push_back(stone[0]);
}
unordered_set<int> visited;
int islands = 0;
for (const vector<int>& stone : stones) {
if (visited.count(stone[0])) continue;
++islands;
dfs(index, visited, stone[0]);
dfs(index, visited, stone[1] + k);
}
return stones.size() - islands;
}Last updated
Was this helpful?