Skip to content

Commit 7f50af4

Browse files
committed
Add LeetCode Weekly Contest 251
1 parent 7673508 commit 7f50af4

File tree

8 files changed

+338
-0
lines changed

8 files changed

+338
-0
lines changed

leetcode/251/a/a.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package main
2+
3+
// Go 模拟
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
func getLucky(s string, k int) (sum int) {
7+
for _, b := range s {
8+
b -= 'a' - 1
9+
sum += int(b/10 + b%10)
10+
}
11+
for k--; k > 0 && sum > 9; k-- {
12+
s := sum
13+
for sum = 0; s > 0; s /= 10 {
14+
sum += s % 10
15+
}
16+
}
17+
return
18+
}

leetcode/251/a/a_test.go

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

leetcode/251/b/b.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
// Go 贪心
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
func maximumNumber(num string, change []int) string {
7+
s := []byte(num)
8+
i, n := 0, len(s)
9+
for ; i < n && byte(change[s[i]&15]) <= s[i]&15; i++ {
10+
}
11+
for ; i < n && byte(change[s[i]&15]) >= s[i]&15; i++ {
12+
s[i] = '0' + byte(change[s[i]&15])
13+
}
14+
return string(s)
15+
}

leetcode/251/b/b_test.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

leetcode/251/c/c.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package main
2+
3+
// O(m^3) 二分图最大带权匹配
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
const inf int = 1e9
7+
8+
func KuhnMunkres(wt [][]int) (sum int) {
9+
match := make([]int, len(wt)) // 右部点匹配了哪一个左部点
10+
la := make([]int, len(wt))
11+
for i, row := range wt {
12+
la[i] = -inf
13+
for _, v := range row {
14+
if v > la[i] {
15+
la[i] = v
16+
}
17+
}
18+
}
19+
lb := make([]int, len(wt))
20+
slack := make([]int, len(wt))
21+
for i := 1; i < len(wt); i++ {
22+
vb := make([]bool, len(wt))
23+
for j := 1; j < len(wt); j++ {
24+
slack[j] = inf
25+
}
26+
last := make([]int, len(wt)) // 右部点在交错树中的上一个右部点,用于倒推得到交错路
27+
y := 0
28+
match[0] = i // 一开始假设有一条 i-0 的匹配
29+
for {
30+
vb[y] = true
31+
x, nextY := match[y], 0
32+
delta := inf
33+
for j := 1; j < len(wt); j++ {
34+
if !vb[j] {
35+
if d := la[x] + lb[j] - wt[x][j]; d < slack[j] {
36+
slack[j] = d
37+
last[j] = y
38+
}
39+
if slack[j] < delta {
40+
delta = slack[j]
41+
nextY = j
42+
}
43+
}
44+
}
45+
// 当 delta=0 时,相当于沿着相等子图向下搜索一层
46+
// 当 delta>0 时,相当于直接回到最小边(新加入相等子图的边)处开始搜索
47+
if delta > 0 {
48+
for j := 0; j < len(wt); j++ {
49+
if vb[j] {
50+
la[match[j]] -= delta
51+
lb[j] += delta
52+
} else {
53+
slack[j] -= delta
54+
}
55+
}
56+
}
57+
y = nextY
58+
if match[y] == 0 {
59+
break
60+
}
61+
}
62+
// 倒推更新增广路
63+
for ; y > 0; y = last[y] {
64+
match[y] = match[last[y]]
65+
}
66+
}
67+
for w := 1; w < len(wt); w++ {
68+
sum += wt[match[w]][w]
69+
}
70+
return
71+
}
72+
73+
func maxCompatibilitySum(students [][]int, mentors [][]int) int {
74+
m := len(students)
75+
wt := make([][]int, m+1)
76+
wt[0] = make([]int, m+1)
77+
for i := range wt[0] {
78+
wt[0][i] = -inf
79+
}
80+
for i, st := range students {
81+
wt[i+1] = make([]int, m+1)
82+
wt[i+1][0] = -inf
83+
for j, mt := range mentors {
84+
for k, v := range st {
85+
if v == mt[k] {
86+
wt[i+1][j+1]++
87+
}
88+
}
89+
}
90+
}
91+
return KuhnMunkres(wt)
92+
}

leetcode/251/c/c_test.go

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

leetcode/251/d/d.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package main
2+
3+
import (
4+
"sort"
5+
"strings"
6+
)
7+
8+
/* 字典树+哈希表
9+
10+
我们用一颗字典树去表示整个文件系统,然后 DFS 这颗字典树,并用括号表达式按字典序拼接所有子树。
11+
12+
以示例 $4$ 为例,文件夹 $\texttt{a}$ 的子树的括号表达式为 $\texttt{(x(y))(z)}$。
13+
14+
![](https://assets.leetcode.com/uploads/2021/07/19/lc-dupfolder4_.jpg)
15+
16+
这一表达方式包含了子树的节点名称和父子关系,因此可用于判断两个文件夹是否为相同文件夹。
17+
18+
代码实现时,可以用一个哈希表去存储括号表达式及其对应的文件夹节点列表。在 DFS 结束后,遍历哈希表,若一个括号表达式对应的节点个数大于 $1$,则将该括号表达式对应的所有节点标记为待删除。然后再次 DFS 这颗字典树,仅访问未被删除的节点,并将路径记录到答案中。
19+
20+
*/
21+
22+
// github.com/EndlessCheng/codeforces-go
23+
type folder struct {
24+
son map[string]*folder
25+
val string // 文件夹名称
26+
del bool // 删除标记
27+
}
28+
29+
func deleteDuplicateFolder(paths [][]string) (ans [][]string) {
30+
root := &folder{}
31+
for _, path := range paths {
32+
// 将 path 加入字典树
33+
f := root
34+
for _, s := range path {
35+
if f.son == nil {
36+
f.son = map[string]*folder{}
37+
}
38+
if f.son[s] == nil {
39+
f.son[s] = &folder{}
40+
}
41+
f = f.son[s]
42+
f.val = s
43+
}
44+
}
45+
46+
folders := map[string][]*folder{} // 存储括号表达式及其对应的文件夹节点列表
47+
var dfs func(*folder) string
48+
dfs = func(f *folder) string {
49+
if f.son == nil {
50+
return "(" + f.val + ")"
51+
}
52+
expr := []string{}
53+
for _, son := range f.son {
54+
expr = append(expr, dfs(son))
55+
}
56+
sort.Strings(expr)
57+
subTreeExpr := strings.Join(expr, "") // 按字典序拼接所有子树
58+
folders[subTreeExpr] = append(folders[subTreeExpr], f)
59+
return "(" + f.val + subTreeExpr + ")"
60+
}
61+
dfs(root)
62+
63+
for _, fs := range folders {
64+
if len(fs) > 1 { // 将括号表达式对应的节点个数大于 1 的节点全部删除
65+
for _, f := range fs {
66+
f.del = true
67+
}
68+
}
69+
}
70+
71+
// 再次 DFS 这颗字典树,仅访问未被删除的节点,并将路径记录到答案中
72+
path := []string{}
73+
var dfs2 func(*folder)
74+
dfs2 = func(f *folder) {
75+
if f.del {
76+
return
77+
}
78+
path = append(path, f.val)
79+
ans = append(ans, append([]string(nil), path...))
80+
for _, son := range f.son {
81+
dfs2(son)
82+
}
83+
path = path[:len(path)-1]
84+
}
85+
for _, son := range root.son {
86+
dfs2(son)
87+
}
88+
return
89+
}

leetcode/251/d/d_test.go

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)