leetcode 947. 移除最多的同行或同列的石头
2024-10-20 06:36:13
题目描述:
在二维平面上,我们将石头放置在一些整数坐标点上。每个坐标点上最多只能有一块石头。
现在,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 <= stones.length <= 1000
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;
}
};
最新文章
- 关于IOS浏览器:document,body的click事件触发规则
- 【Unity3D游戏开发】基础知识之Tags和Layers (三二)[转]
- JavaScript Array(数组) 对象
- AVD启动不了 ANDROID_SDK_HOME is defined but could not find *.ini
- mvc Html.RenderAction方法解析
- C++生产和使用的临时对象
- Java数组的一些使用方法及堆栈存储
- linux学习(JDK,Tomcat,nginx)安装
- java去除表达符号的正则表达式
- blfs(systemv版本)学习笔记-总页
- 重写Override ToString()方法
- PHP删除空格函数
- js防止表单重复提交
- 测试人员需要了解的sql知识(基础篇)
- java深浅拷贝
- [LeetCode&;Python] Problem 728. Self Dividing Numbers
- jquery -- 触屏设备touch事件
- Hibernate抽取BaseDao
- asp.net微信公众平台本地调试设置
- Android无线测试之—Genymotion模拟器环境搭建