Table of Contents
Problem Statement
Most Stones Removed with Same Row or Column LeetCode Solution says that On a 2D plane
we place n stones at some integer coordinate points. Each coordinate point may have at most one stone. A stone can be removed if it shares either the same row or the same column as another stone that has not been removed. An array stones of length n where stones[i] = [xi, yi] represents the location of the ith stone. We have to find the largest number of stones to be removed.
Example 1:
Input:
stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
Output:
5
Explanation:
One way to remove 5 stones is as follows: 1. Remove stone [2,2] because it shares the same row as [2,1]. 2. Remove stone [2,1] because it shares the same column as [0,1]. 3. Remove stone [1,2] because it shares the same row as [1,0]. 4. Remove stone [1,0] because it shares the same column as [0,0]. 5. Remove stone [0,1] because it shares the same row as [0,0]. Stone [0,0] cannot be removed since it does not share a row/column with another stone still on the plane.
Example 2:
Input:
stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
Output:
3
Explanation:
One way to make 3 moves is as follows: 1. Remove stone [2,2] because it shares the same row as [2,0]. 2. Remove stone [2,0] because it shares the same column as [0,0]. 3. Remove stone [0,2] because it shares the same row as [0,0]. Stones [0,0] and [1,1] cannot be removed since they do not share a row/column with another stone still on the plane.
Example 3:
Input:
stones = [[0,0]]
Output:
0
Explanation:
[0,0] is the only stone on the plane, so you cannot remove it.
Constraints:
1 <= stones.length <= 10000 <= xi, yi<= 104- No two stones are at the same coordinate point.
Approach
Idea
- The idea here is that we can remove all stones from the group of connected stones except the last one.
- If stone
aand stonebare in the same column/row, we connect them as a component. That means we can make them as connected components. - The maximum number of stones can be removed = the number of stones-connected components.
- For finding the connected components we can use DFS/BFS or Union find algorithms.

Code
C++ Solution
class Solution {
public:
#define ll int
ll par[10005];
void make()
{
ll i;
for(i=0;i<=10000;i++)
par[i]=i;
}
ll find(ll x)
{
if(par[x]==x)return x;
return par[x]=find(par[x]);
}
ll unite(ll x,ll y)
{
ll p1=find(x);
ll p2=find(y);
if(p1!=p2)
{
par[p1]=p2;
}
return 0;
}
int removeStones(vector<vector<int>>& stones) {
make();
set<ll>s;
ll i,j,n=stones.size();
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stones[i][0]==stones[j][0] or stones[i][1]==stones[j][1])
{
unite(i,j);
}
}
}
ll cnt=0;
for(i=0;i<n;i++)
{
if(par[i]==i)cnt++;
}
return stones.size()-cnt;
}
};Java Solution
class Solution {
int[] par=new int[10005];
void make()
{
int i;
for(i=0;i<=10000;i++)
par[i]=i;
}
int find(int x)
{
if(par[x]==x)
return x;
return par[x]=find(par[x]);
}
int unite(int x,int y)
{
int p1=find(x);
int p2=find(y);
if(p1!=p2)
{
par[p2]=p1;
}
return 0;
}
public int removeStones(int[][] stones) {
int i,j,n=stones.length;
make();
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stones[i][0]==stones[j][0] || stones[i][1]==stones[j][1])
{
unite(i,j);
}
}
}
int cnt=0;
for(i=0;i<n;i++)
{
if(par[i]==i)cnt++;
}
int k=n-cnt;
return k;
}
}
Complexity Analysis of Most Stones Removed with Same Row or Column LeetCode Solution
Time Complexity
Time complexity is O(N*N). As we are looping in the array to connect them. Where N is the array size.
Space Complexity
Space complexity is 0(N). We are taking extra space to store the parents.