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: 5

Example 2:

Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
Output: 3

Example 3:

Input: stones = [[0,0]]
Output: 0

Note:

  1. 1 <= stones.length <= 1000

  2. 0 <= 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?