LeetCode 947. 移除最多的同行或同列石头 并查集
传送门
思路
干货太干就不太好理解了,以下会有点话痨( ̄▽ ̄)"
首先题目给了一个二维stones数组,存储每个石子的坐标,因为在同行或者同列的石子最终可以被取到只剩下一个,那么我们将同行同列的石子归属于一个集合,开始套用并查集的思想求一下有几个集合似乎就搞定了?想到这是我看到题目的想法,但是为了实际使用并查集,有几个细节需要注意:
本题并查集究竟要合并什么?对于一个坐标(x,y)来说它有两个值组成,x表示所属x行,y表示所属于y列,而按照我们既定的思维,同行同列的石子属于一个集合,那么关键就在于(x,y)作为桥梁沟通了x行和y列,使得行集合与列集合合并成一个集合了(它们两个集合可以取得只剩下一个石子),所以需要合并的是行号和列号
这个stones数组存储的是二维空间的坐标,而并查集是在一维进行操作的,好比说0行0列都是0,怎么区分?这里用一个朴素的方法,由于x,y的取值范围为0~10^4,那么将其中一个轴+10001或者减去10001就能保证二维的数据映射到一维进行区分,就是x映射为x+10001,用映射的值去和y进行并查集操作
最后我们统计一个所有的不相交子集的个数(好像也叫做:极大连通子图个数,连通分量),用石子数减去集合数就是最多可以移除的石子数
Java解法,其实是伪装成Java的c++,由于还不怎么熟悉Java的一些集合框架,这题直接开了大的空间
class Solution {
int parent[] = new int[20005];
int vis[] = new int[20005];
public int removeStones(int[][] stones) {
int ans = 0;
for (int i = 0; i < 20005; i++){
parent[i] = i;
vis[i] = 0;
}
for (int[] stone : stones) {
//(x,y)是一个坐标,而第x行所有点在一个集合,第y列
//所有点在一个集合,(x,y)的存在就使得x行集合与y列
//集合可以合并为一个集合,因为它们构成了一个连通图
//配合+10001操作,并查集可以从二维转化为一维,从而
//实现编号为x+10001的行集合与编号为y的列集合的合并
union(stone[0] + 10001, stone[1]);
vis[stone[0] + 10001] = 1;
vis[stone[1]] = 1;
}
for(int i = 0; i < 20005; i++) {
if(vis[i] == 1 && parent[i] == i) ans++;
}
return stones.length - ans;
}
public void union(int x, int y) {
int fx = find(x);
int fy = find(y);
if (fx != fy) parent[fy] = fx;
}
public int find(int x) {
while (parent[x] != x) x = parent[x];
return x;
}
}
LeetCode 947. 移除最多的同行或同列石头 并查集的更多相关文章
- leetcode 947. 移除最多的同行或同列的石头
题目描述: 在二维平面上,我们将石头放置在一些整数坐标点上.每个坐标点上最多只能有一块石头. 现在,move 操作将会移除与网格上的某一块石头共享一列或一行的一块石头. 我们最多能执行多少次 move ...
- [Swift]LeetCode947. 移除最多的同行或同列石头 | Most Stones Removed with Same Row or Column
On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may have at ...
- leetcode 886. 可能的二分法(DFS,染色,种类并查集)
题目链接 886. 可能的二分法 题意: 给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 ...
- LeetCode:移除K位数字【402】
LeetCode:移除K位数字[402] 题目描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. nu ...
- 前端与算法 leetcode 27.移除元素
目录 # 前端与算法 leetcode 27.移除元素 题目描述 概要 提示 解析 算法 @(目录) # 前端与算法 leetcode 27.移除元素 题目描述 27.移除元素 概要 题目本身其实挺简 ...
- 【转载】C#通过Remove方法移除DataTable中的某一列数据
在C#中的Datatable数据变量的操作过程中,有时候我们需要移除当前DataTable变量中的某一列的数据,此时我们就需要使用到DataTable变量内部的Columns属性变量的Remove方法 ...
- [LeetCode] 168. Excel Sheet Column Title 求Excel表列名称
Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...
- Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)
Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...
- Leetcode之并查集专题-684. 冗余连接(Redundant Connection)
Leetcode之并查集专题-684. 冗余连接(Redundant Connection) 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2 ...
- 【LeetCode】并查集 union-find(共16题)
链接:https://leetcode.com/tag/union-find/ [128]Longest Consecutive Sequence (2018年11月22日,开始解决hard题) 给 ...
随机推荐
- ERROR: Command errored out with exit status 1:
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting CairoSVG==2.4.2 Using cached ...
- Ubuntu上解决快捷键与idea快捷键冲突
Ubuntu上解决快捷键与idea快捷键冲突 一.ubuntu 本身系统导致,需要修改 ubuntu 快捷键 解决方案: 设置 按钮→系统设置→硬件选项区域中的"键盘"→切换到&q ...
- 轻松合并Excel工作表:Java批量操作优化技巧
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在Excel中设计表单时,我们经常需要对收集的信息进行统 ...
- ES6和node模块化
node模块化: 1.输出:exports.a=12; 或者module.exports={ a:12, b:5 } 2.引入:require('./a.js'); 3.引用自定义模块 放到node_ ...
- 银河麒麟V10 SP1忘记账户密码后重置/更改账户密码
开机进入选择界面,按下键盘E键 光标通过键盘上下左右键移到linux行最后一句(此处是seurity=kysec后) 输入空格 console=tty1 single 按下F10键,等待重启 输入pa ...
- WC 2023 冬眠记
打得很烂,果然还是太菜了. Day -? 连第二课堂都听不懂,我选择冬眠. Day 1 发压缩包时看大小猜测今年又有交互题.果不其然. 那就只剩下两道可做题了(悲) 通读题面,尝试思考 T1,无果,周 ...
- 详述Java内存屏障,透彻理解volatile
一般来说内存屏障分为两层:编译器屏障和CPU屏障,前者只在编译期生效,目的是防止编译器生成乱序的内存访问指令:后者通过插入或修改特定的CPU指令,在运行时防止内存访问指令乱序执行. 下面简单说一下这两 ...
- Molecule 在构建工具中的选择
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:修能 朝闻道,夕死可矣 何为 Molecule? 轻量级的 ...
- DS18B20初始化-读-写-温度转换
DS18B20 (一)初始化 (二)读字节 (三)写字节 (四)温度转换 1获得数据 2转换数据 (一)初始化 初始化时序: 数据线先拉到高电平,稍作延时即可(刚开始是高电平还是低电平芯片手册上其实不 ...
- Hundred Finance 攻击事件分析
Hundred Finance 背景知识 Hundred Finance 是 fork Compound 的一个借贷项目,在2023/04/15遭受了黑客攻击.攻击者在发起攻击交易之前执行了两笔准备交 ...