lc684_冗余连接 雇主如何榨取工人并逍遥法外?【TED演讲】 Book_斯蒂芬.乔布斯传 acme.sh教程精简注意版实战
Algorithm
lc684_冗余连接
思路:
因为题意是找最后一条边,而且有且仅有一条边,那其实就是找到成环的边,然后返回。
因此要点就变成了怎么判断环。
直接并查集,然后每次判断是否两点都在同一个并查集,如果都在则说明成环,返回结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
impl Solution {
pub fn find_redundant_connection(edges: Vec<Vec<i32>>) -> Vec<i32> {
let n = edges.len();
// 初始化并查集,每个节点的父节点初始为自身
//
// 这行代码做了以下几件事:
// 1. 创建一个范围 0..=n,这是一个包含从0到n的所有整数的范围
// 2. 使用 collect 方法将这个范围转换成一个 Vec<usize> 类型的向量
// 3. 结果是一个长度为 n+1 的向量,索引从0到n
// 4. 范围 0..=n 生成的每个数字直接成为向量中对应位置的元素值
// 例如,对于索引0,元素值为0;对于索引1,元素值为1,以此类推
// 5. 这effectively初始化了并查集,每个节点指向自己,表示它们都是独立的集合
// 6. 使用 mut 关键字使 parent 可变,因为后续操作中我们需要修改这个向量
let mut parent = (0..=n).collect::<Vec<usize>>();
// 查找节点x的根节点,并进行路径压缩
fn find(parent: &mut Vec<usize>, x: usize) -> usize {
if parent[x] != x {
parent[x] = find(parent, parent[x]);
}
parent[x]
}
// 合并两个集合
fn union(parent: &mut Vec<usize>, x: usize, y: usize) {
let root_x = find(parent, x);
let root_y = find(parent, y);
if root_x != root_y {
parent[root_x] = root_y;
}
}
// 遍历所有边
for edge in edges.iter() {
let u = edge[0] as usize;
let v = edge[1] as usize;
// 如果两个节点已经在同一个集合中,说明找到了冗余连接
if find(&mut parent, u) == find(&mut parent, v) {
return edge.clone();
}
// 否则,合并这两个节点所在的集合
union(&mut parent, u, v);
}
// 如果没有找到冗余连接,返回空向量(理论上不会发生)
Vec::new()
}
}
|
和题解思路一毛一样,不过自己偷懒用了cursor自动写,然后学习rust写法。
let mut parent = (0..=n).collect::<Vec<usize>>();
的写法非常精妙, 学习了。
Review
雇主如何榨取工人并逍遥法外?【TED演讲】
主要讲述了day laborer 的悲惨生活,如何被雇主剥削。
然后启示需要认真对待劳动力,因为这样才能让更多人劳有所得,才能有持续健康的劳动力。
但是感觉现实的残酷在于,物以稀为贵,现在很多发展中国家还是太多廉价劳动力了。
Tips
Book_斯蒂芬.乔布斯传
Because the people who are crazy enough to think they can change the world, are the ones who do.
Share
acme.sh教程精简注意版实战
acme.sh 使用教程
主要注意点:
acme.sh脚本默认ca服务器是zerossl,经常出错,会导致获取证书的时候一直出现:Pending, The CA is processing your order, please just wait.
只需要把ca服务器改成letsencrypt 即可,虽然更改以后还是有概率出现pending,但基本2-3次即可成功
1
|
acme.sh --set-default-ca --server letsencrypt
|
1. 安装acme.sh
1
2
3
4
5
6
|
[root@us-arm ~]# mkdir acme
[root@us-arm ~]# cd acme/
# 记得别用example.com, 否则后面也会报错出错
[root@us-arm acme]# curl https://get.acme.sh | sh -s email=my@example.com
# 更新bashrc为了让acme.sh命令生效
[root@us-arm acme]# source ~/.bashrc
|
2. 生成证书
要点: acme.sh --set-default-ca --server letsencrypt
1
2
3
4
5
|
# 设置ca服务器为letsencrypt
[root@us-arm acme]# acme.sh --set-default-ca --server letsencrypt
# 生成证书
# 这里只给 www.wolfdan.cn 生成证书, 可以根据自己网站情况修改成 `-d example.com -d www.example.com`
[root@us-arm acme]# acme.sh --issue -d www.wolfdan.cn --webroot /var/www/public/
|
3. 安装证书
1
2
3
4
5
6
7
|
# 创建证书目录
[root@us-arm acme]# mkdir -p /etc/nginx/certs/
# 安装证书
[root@us-arm acme]# acme.sh --install-cert -d www.wolfdan.cn \
--key-file /etc/nginx/certs/www.wolfdan.cn.key \
--fullchain-file /etc/nginx/certs/fullchain.cer \
--reloadcmd "service nginx force-reload"
|
1
2
3
4
5
|
# 修改 nginx 配置
# 注意key对应的是`.key`文件
[root@us-arm acme]# vim /etc/nginx/nginx.conf
# 重启 nginx
[root@us-arm acme]# service nginx force-reload
|
4. 自动更新
会有默认每天凌晨5:03自动更新,但是不需要这么频繁,所以改成每60天更新一次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
crontab -e
# 每天凌晨5:03自动运行acme.sh的更新脚本
# 3: 分钟
# 5: 小时
# *: 每天
# *: 每月
# *: 每周的每一天
# 命令: 运行acme.sh的cron任务,输出重定向到/dev/null(即不保存输出)
# 3 5 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
# 改成每60天一次吧
6 6 */60 * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
# 查看
crontab -l
|