2022-09-03:n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。 给你一个长度为 n 的数组
2022-09-03:n块石头放置在二维平面中的一些整数坐标点上
每个坐标点上最多只能有一块石头
如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。
给你一个长度为 n 的数组 stones ,
其中 stones[i] = [xi, yi] 表示第 i 块石头的位置,
返回 可以移除的石子 的最大数量。
输入: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]。
输出: 5。
答案2022-09-03:
并查集。行代表和列代表合并。
代码用rust编写。代码如下:
use std::collections::HashMap;
fn main() {
let mut stones = vec![
vec![0, 0],
vec![0, 1],
vec![1, 0],
vec![1, 2],
vec![2, 1],
vec![2, 2],
];
let ans = remove_stones(&mut stones);
println!("ans = {}", ans);
}
fn remove_stones(stones: &mut Vec<Vec<i32>>) -> i32 {
let n = stones.len() as i32;
let mut row_pre: HashMap<i32, i32> = HashMap::new();
let mut col_pre: HashMap<i32, i32> = HashMap::new();
let mut uf = UnionFind::new(n);
for i in 0..n {
let x = stones[i as usize][0];
let y = stones[i as usize][1];
if !row_pre.contains_key(&x) {
row_pre.insert(x, i);
} else {
uf.union(i, *row_pre.get(&x).unwrap());
}
if !col_pre.contains_key(&y) {
col_pre.insert(y, i);
} else {
uf.union(i, *col_pre.get(&y).unwrap());
}
}
return n - uf.sets();
}
pub struct UnionFind {
father: Vec<i32>,
size: Vec<i32>,
help: Vec<i32>,
sets: i32,
}
impl UnionFind {
fn new(n: i32) -> UnionFind {
let mut father: Vec<i32> = vec![];
let mut size: Vec<i32> = vec![];
let mut help: Vec<i32> = vec![];
for i in 0..n {
father.push(i);
size.push(1);
help.push(0);
}
UnionFind {
father,
size,
help,
sets: n,
}
}
fn union(&mut self, mut i: i32, mut j: i32) {
i = self.find(i);
j = self.find(j);
if i != j {
if self.size[i as usize] >= self.size[j as usize] {
self.father[j as usize] = i;
self.size[i as usize] += self.size[j as usize];
} else {
self.father[i as usize] = j;
self.size[j as usize] += self.size[i as usize];
}
self.sets -= 1;
}
}
fn find(&mut self, mut i: i32) -> i32 {
let mut s = 0;
while i != self.father[i as usize] {
self.help[s] = i;
s += 1;
i = self.father[i as usize];
}
while s > 0 {
s -= 1;
self.father[self.help[s] as usize] = i;
}
return i;
}
fn sets(&mut self) -> i32 {
self.sets
}
}
执行结果如下:

2022-09-03:n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。 给你一个长度为 n 的数组的更多相关文章
- Dapr中国社区活动之 分布式运行时开发者日 (2022.09.03)
自2019年10月首次发布以来,Dapr(Distributed Application Runtime,分布式应用运行时)因其"更稳定"."更可靠".&quo ...
- [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 947. 移除最多的同行或同列的石头
题目描述: 在二维平面上,我们将石头放置在一些整数坐标点上.每个坐标点上最多只能有一块石头. 现在,move 操作将会移除与网格上的某一块石头共享一列或一行的一块石头. 我们最多能执行多少次 move ...
- MySQL锁这块石头似乎没有我想的那么重
前言 前言为本人写这篇文章的牢骚,建议跳过不看. 之前好几次都想好好的学习MySQL中的锁,但是找了几篇文章,看了一些锁的类型有那么多种,一时间也没看懂是什么意思,于是跟自己说先放松下自己,便从书 ...
- 【LabVIEW技巧】代码块快速放置
前言 之前的文章中介绍了如何使用QuickDrop来实现快速代码放置,今天我们来详细的聊一下如何进行代码块的快速放置. 正文 LabVIWE程序设计中,我们在架构层级总是进行重复性的编写.举一个例子: ...
- VARCHAR列上的索引
一年前,我写了在索引的导航结构里,SQL Server如何存储VARCHAR列.我们都知道,在SQL Server里索引(聚集索引,非聚集索引)的键列有最大900byte的大小限制. 假设现在你想捉弄 ...
- http://www.cnblogs.com/Lawson/archive/2012/09/03/2669122.html
http://www.cnblogs.com/Lawson/archive/2012/09/03/2669122.html
- SQL Server如何在变长列上存储索引
这篇文章我想谈下SQL Server如何在变长列上存储索引.首先我们创建一个包含变长列的表,在上面定义主键,即在上面定义了聚集索引,然后往里面插入80000条记录: -- Create a new t ...
- 避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用
点击(此处)折叠或打开 --在sal列上创建非唯一索引 scott@TESTDB11>create index idx_emp1_sal on emp1(sal); Index created. ...
- UNIQUEIDENTIFIER列上的统计信息
UNIQUEIDENTIFIER列上的统计信息非常有意思,在它上面有一些很令人讨厌的行为.我们来看下. 问题重现(The repro) 为了向你展示我们刚抱怨的行为,我用下列简单的表定义创建了一个数据 ...
随机推荐
- cmd查看对应端口使用情况
cmd查看端口号netstat -ano | findstr 80
- Scanner进阶使用
Scanner 进阶使用 package com.andy.base.scanner; import java.util.Scanner; public class Demo04 { public s ...
- Codeforces Round 857 (Div. 2) A-D
Codeforces Round 857 (Div. 2) A. Likes 求每回合最大的数列:先全使用正数,每个正数对ans++,再全使用负数,每个负数对ans-- 求每回合最小的数列:方法1(模 ...
- 5分钟带你彻底搞懂async底层实现原理!
ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖.研究 async 的原理,就必须先弄清楚 Genera ...
- 安装原版Windows自动安装已经备份的驱动
安装完Windows10后联网会自动更新驱动,除了自动更新.如果不让新安装的Windows系统自动安装驱动以外,还有自己手动安装驱动的方式.如何在安装系统过程中就让系统自己安装好驱动? 重装系统首先要 ...
- 机器学习算法(八):基于BP神经网络的乳腺癌的分类预测
机器学习算法(八):基于BP神经网络的乳腺癌的分类预测 1.算法简介和应用 1.1 算法简介 BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学 ...
- 【Jenkins系列】-Pipeline语法全集
Jenkins为您提供了两种开发管道代码的方式:脚本式和声明式. 脚本式流水线(也称为"传统"流水线)基于Groovy作为其特定于域的语言. 而声明式流水线提供了简化且更友好的语法 ...
- 如何用java校验SQL语句的合法性?(提供五种解决方案)
方案一:使用JDBC API中提供的Statement接口的execute()方法 要在Java中校验SQL语句的合法性,可以使用JDBC API中提供的Statement接口的execute()方法 ...
- [issues] webrtc 接入SRS丢包率不正确问题
目录 [issues] webrtc 接入SRS丢包率不正确问题 原因和解决方法 srs增加rtx SDP协商 构建RTX包 [issues] webrtc 接入SRS丢包率不正确问题 原因和解决方法 ...
- ffmpeg protocol concat 进行ts流合并视频的时间戳计算及其音画同步方式一点浅析
ffmpeg protocol concat 进行ts流合并视频的时间戳计算及音画同步方式一点浅析 目录 ffmpeg protocol concat 进行ts流合并视频的时间戳计算及音画同步方式一点 ...