LeetCode每日一题,947. Most Stones Removed with Same Row or Column
先看题目描述
大意就是给定一个 stones 数组,代表 n 个石头的二维坐标,如果一块石头的同行或同列上有其他石头存在,那么就可以移除这块石头,问最多可以移除多少块石头
算法和思路
并查集
我们可以把二维平面上的石头视为点,若两个石头的横坐标或纵坐标相同,则视为它们之间有边,我们根据移除石头的规则,可以得知对于一个连通图,我们可以把一个连通图里的所有顶点根据规则删除到只剩一个顶点,于是最多可以删除的石头数就是所有石头的数量 - 连通分量的个数,问题就转化为了如何求给定图的连通分量个数
求连通分量个数我们可以通过并查集解决,我们创建两个哈希表 rows 和 cols,分别维护横坐标,纵坐标和在对应坐标上第一次出现的石头,以 stones[i] 为例,当遍历到 stones[i] 时,设其横坐标和纵坐标为 row 和 col,若哈希表 rows 中存在键 row,其对应的值为 key,则说明在 stones[i] 前存在横坐标为 row 的石头,第一个横坐标为 row 的石头为 stones[key],于是我们将 i 合并到 key 所在的连通分量中;若哈希表 rows 中不存在键 row,则说明在 stones[i] 之前不存在横坐标为 row 的石头,将键值对 <row,i> 添加到哈希表 rows 中。对于纵坐标 col 和哈希表 cols 做相同处理。这样遍历完 stones 数组时连通分量就通过并查集构造完成了,统计连通分量个数,据此计算结果并返回即可
算法源码
下面是使用哈希表的代码
1 | class Solution { |
由于题目中限制了横坐标和纵坐标的范围为 0 ~ 10000,于是可以用数组代替哈希表,从而优化运行效率
1 | class Solution { |
下面这个是将并查集作为内部类的写法
1 | class Solution { |