移除最多的同行或同列石头
解决代码:
class Solution {
public:
vector<int >a;
vector<int >h;
int num=0;
void unionfind(int n)
{
for(int i=0;i<n;i++)
{
a.push_back(i);
h.push_back(0);
}
}
int find(int x)
{
return x==a[x]? x :a[x] = find(a[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return ;
else
{
if(h[x]<h[y])
{
a[x]=y;
}
else
{
a[y]=x;
if(h[x]==h[y]) h[x]++;
}
num++;
}
}
int removeStones(vector<vector<int>>& stones) {
int n=stones.size();
unionfind(n);
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(stones[i][0]==stones[j][0]||stones[i][1]==stones[j][1])
{
unite(i,j);
}
}
}
return num;
}
};
题目要求对同行或同列的石头进行删减,最后剩下一个节点。
联想到运用并查集来解决,同行或同列的元素属于同一棵树,依次删减叶子最后只剩下树根元素。
这里我们搜索进行合并,每合并一次就使num++
,最终移除的石头数量就等于合并的次数。