传送门

思路

干货太干就不太好理解了,以下会有点话痨( ̄▽ ̄)"

首先题目给了一个二维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. 移除最多的同行或同列石头 并查集的更多相关文章

  1. leetcode 947. 移除最多的同行或同列的石头

    题目描述: 在二维平面上,我们将石头放置在一些整数坐标点上.每个坐标点上最多只能有一块石头. 现在,move 操作将会移除与网格上的某一块石头共享一列或一行的一块石头. 我们最多能执行多少次 move ...

  2. [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 ...

  3. leetcode 886. 可能的二分法(DFS,染色,种类并查集)

    题目链接 886. 可能的二分法 题意: 给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 ...

  4. LeetCode:移除K位数字【402】

    LeetCode:移除K位数字[402] 题目描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. nu ...

  5. 前端与算法 leetcode 27.移除元素

    目录 # 前端与算法 leetcode 27.移除元素 题目描述 概要 提示 解析 算法 @(目录) # 前端与算法 leetcode 27.移除元素 题目描述 27.移除元素 概要 题目本身其实挺简 ...

  6. 【转载】C#通过Remove方法移除DataTable中的某一列数据

    在C#中的Datatable数据变量的操作过程中,有时候我们需要移除当前DataTable变量中的某一列的数据,此时我们就需要使用到DataTable变量内部的Columns属性变量的Remove方法 ...

  7. [LeetCode] 168. Excel Sheet Column Title 求Excel表列名称

    Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...

  8. Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)

    Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...

  9. Leetcode之并查集专题-684. 冗余连接(Redundant Connection)

    Leetcode之并查集专题-684. 冗余连接(Redundant Connection) 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2 ...

  10. 【LeetCode】并查集 union-find(共16题)

    链接:https://leetcode.com/tag/union-find/ [128]Longest Consecutive Sequence  (2018年11月22日,开始解决hard题) 给 ...

随机推荐

  1. [CISCN 2019华东南]Web11

    看到下面connection 里面的内容有一点像抓包出来的 就抓包试试 似乎感觉也没有什么用 看到这个东西,那么就想到改IP 添加X-Forwarded-For:127.0.0.1 发现这个IP随着我 ...

  2. 环境搭建:在VSCode搭建Python环境

      1.安装vscode     2.下载python解释器 安装python https://www.python.org/downloads/windows/ 下载可执行的安装文件:   安装完成 ...

  3. Python - 字典3

    修改字典项 您可以通过引用其键名来更改特定项的值: 示例,将 "year" 更改为 2018: thisdict = { "brand": "Ford ...

  4. OTOCI 题解

    OTOCI 题目大意 给定 \(n\) 个带权的点,需要进行四种操作:查询两点连通性:加边:修改点权:查询两点路径的权值和. 思路分析 首先观察题目,我们会发现,在所有的操作结束后,所有的点构成一个森 ...

  5. ubuntu系统安装到U盘便捷启动

    1.前言 实现u盘系统即插即用,便捷带走.这里需要使用到VM虚拟机进行安装,这里选择64位的ubuntu系统. 2.运行VM虚拟机 以管理员运行VM虚拟机,创建一个ubuntu系统,然后选中相关的镜像 ...

  6. require()、import、import()有哪些区别?

    require().import.import()是我们常用的引入模块的三种方式,代码中几乎处处用到.如果对它们存在模糊,就会在工作过程中不断产生困惑,更无法做到对它们的使用挥洒自如.今天我们来一起捋 ...

  7. tableau用数值呈现条形图的总计

    创建计算字段 创建计算字段:销售额总计,键入函数: IF Size()=1 THEN 0 ELSE Sum([销售额]) END 创建视图 将度量"销售额"拖放至列,将维度&quo ...

  8. Stable Diffusion扩散模型

    人像生成模型 1.模型理论基础 扩散模型(Diffusion Model): 1.1 Diffusion Model 原理 首先,Denoise Model 需要一个起始的噪声图像作为输入.这个噪声图 ...

  9. 简易的git命令行入门教程

    一.Git 全局设置 git config --global user.name "用户名" git config --global user.email "邮件地址@1 ...

  10. Java数组最常用操作方法(Arrays类)

    最近在写代码的过程中发现我们很多地方都会处理数组,有时只是模糊的记得有API可以调用,每次都查文档很是费事儿,适当的总结希望提高开发速度 一.申明数组 数组的申明十分简单也十分的基础,注意第三种申明方 ...