题目描述:

在二维平面上,我们将石头放置在一些整数坐标点上。每个坐标点上最多只能有一块石头。

现在,move 操作将会移除与网格上的某一块石头共享一列或一行的一块石头。

我们最多能执行多少次 move 操作?

示例 1:

输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
输出:5
示例 2:

输入:stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
输出:3
示例 3:

输入:stones = [[0,0]]
输出:0

提示:

  1. 1 <= stones.length <= 1000
  2. 0 <= stones[i][j] < 10000

思路分析:

题目理解起来实际就是求独立分量的个数。这类题就用并查集,一开始被两个坐标的比较限制,实际只要二者满足一个即可。利用一个数组来存每个位置的组号,满足同行同列就进行归并。初始所有的组号都为-1,最后统计剩余的-1个数,总数减去独立分量的个数即为所求。

代码:

 class Solution {
public:
int find(vector<int>&f, int x)
{
return f[x]==-?x:find(f, f[x]);
}
void u(vector<int>&f, int i, int j)
{
int fx = find(f, i);
int fy = find(f, j);
if(fx!=fy)
f[fx] = fy;
}
int removeStones(vector<vector<int>>& stones) {
if(stones.size()==)
return ;
int n = stones.size();
vector<int> f(n, -);
for(int i=; i<n; i++)
{
for(int j=i+; j<n; j++)
{
if(stones[i][]==stones[j][]||stones[i][]==stones[j][])
{
u(f, i, j);
}
}
}
int cnt=;
for(int i=; i<n; i++)
{
if(f[i]==-)
cnt++;
}
return n-cnt;
}
};

最新文章

  1. 关于IOS浏览器:document,body的click事件触发规则
  2. 【Unity3D游戏开发】基础知识之Tags和Layers (三二)[转]
  3. JavaScript Array(数组) 对象
  4. AVD启动不了 ANDROID_SDK_HOME is defined but could not find *.ini
  5. mvc Html.RenderAction方法解析
  6. C++生产和使用的临时对象
  7. Java数组的一些使用方法及堆栈存储
  8. linux学习(JDK,Tomcat,nginx)安装
  9. java去除表达符号的正则表达式
  10. blfs(systemv版本)学习笔记-总页
  11. 重写Override ToString()方法
  12. PHP删除空格函数
  13. js防止表单重复提交
  14. 测试人员需要了解的sql知识(基础篇)
  15. java深浅拷贝
  16. [LeetCode&amp;Python] Problem 728. Self Dividing Numbers
  17. jquery -- 触屏设备touch事件
  18. Hibernate抽取BaseDao
  19. asp.net微信公众平台本地调试设置
  20. Android无线测试之—Genymotion模拟器环境搭建

热门文章

  1. PyTorch 之 Datasets
  2. DateTime的ToString方法格式
  3. SVN服务端安装和仓库的创建
  4. Markdown温故知新(0):导航目录
  5. QQ互联,填写回调时注意事项
  6. ASP.NET Core MVC上传文件
  7. 基于windows 10打造的kali工具集
  8. JIRA的安装及配置
  9. 在dockers中调试dump的dotnet程序
  10. ubuntu16.04 共享文件夹之后 /mnt/hgfs目录下没有显示共享的文件夹