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题) 给 ...
随机推荐
- ASP.NET 6启动时自动创建MongoDB索引
大家好,我是Edison. 最近,在使用MongoDB时,碰到这样的一个需求:针对某个Collection手动在开发环境创建了索引,但在测试环境和生产环境不想再手动操作了,于是就想着通过代码的方式在A ...
- http 500 错误
214 [Thu Sep 09 16:03:54.919334 2021] [:error] [pid 32045] [client 124.238.184.230:23796] script '/v ...
- Window10安装linux子系统及子系统安装1Panel面板
原文地址:Window10安装linux子系统及子系统安装1Panel面板 - Stars-One的杂货小窝 最近看到halo博客发布了2.10.0,终于是新增了个备份功能,于是有了念头想要升级下 但 ...
- 分布式应用开发的核心技术系列之——基于TCP/IP的原始消息设计
本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本文的内容主要围绕以下几个部分: TCP/IP的简单介绍. 消息的介绍 ...
- JavaScript:垃圾收集机制
JavaScript具有自动垃圾收集机制.也就是说,执行环境会负责管理代码执行过程中使用的内存.开发人员不必关心内存分配和回收问题. 垃圾收集机制的原理:找到不再继续使用的变量,然后进行释放其占用的内 ...
- Error resolving template [sys/prod/prod/list], template might not exist or might not be accessible by any of the configured Template Resolvers
新的商城模板调试接口,一个商品列表的接口调用,返回报错 org.thymeleaf.exceptions.TemplateInputException: Error resolving templat ...
- Qt5 学习积累
目录 1.cout/cin 2.随机数 3.QSting. string.QChar,.char等的转换 4.退出 5.Qt::tr() 6.QFrame::shape,shadow 7.QCombo ...
- JVM-JVM如何加载类
一.Java 语言的类型可以分为两大类: 基本类型(primitive types) 引用类型(reference types):类.接口.数组类和泛型参数(泛型参数会在编译中被擦除),因此Java虚 ...
- JAVA类的加载(1) ——类的加载及类加载器介绍
过程:当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载.连接.初始化三个步骤来对该类进行初始化,有时候称为类加载(类初始化) 类加载 定义:类加载 指的是将类的class文件读入 ...
- go 中如何实现定时任务
定时任务简介 定时任务是指按照预定的时间间隔或特定时间点自动执行的计划任务或操作.这些任务通常用于自动化重复性的工作,以减轻人工操作的负担,提高效率.在计算机编程和应用程序开发中,定时任务是一种常见的 ...