Skip to content

Commit a571b67

Browse files
committed
Add LeetCode Weekly Contest 258
1 parent 2f5f3e9 commit a571b67

File tree

8 files changed

+248
-0
lines changed

8 files changed

+248
-0
lines changed

leetcode/258/a/a.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package main
2+
3+
import "strings"
4+
5+
// 模拟
6+
7+
// github.com/EndlessCheng/codeforces-go
8+
func reversePrefix(s string, ch byte) string {
9+
j := strings.IndexByte(s, ch)
10+
if j < 0 {
11+
return s
12+
}
13+
t := []byte(s)
14+
for i := 0; i < j; i++ {
15+
t[i], t[j] = t[j], t[i]
16+
j--
17+
}
18+
return string(t)
19+
}

leetcode/258/a/a_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/258/b/b.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package main
2+
3+
/*
4+
哈希表统计比值的最简分数
5+
6+
将宽高比 w/h 化简为最简分数,用哈希表统计最简分数的个数。若有 $m$ 个宽高比相同的矩形,则可互换的矩形对有 $C_m2=\dfrac{m\cdot(m-1}{2}$ 个。遍历哈希表,累加所有可互换的矩形对的个数即为答案。
7+
8+
*/
9+
10+
// github.com/EndlessCheng/codeforces-go
11+
func interchangeableRectangles(rectangles [][]int) (ans int64) {
12+
cnt := map[[2]int]int64{}
13+
for _, p := range rectangles {
14+
// 计算 w/h 的最简分数,计入哈希表
15+
w, h := p[0], p[1]
16+
g := gcd(w, h)
17+
cnt[[2]int{w / g, h / g}]++
18+
}
19+
for _, m := range cnt {
20+
ans += m * (m - 1) / 2
21+
}
22+
return
23+
}
24+
25+
func gcd(a, b int) int {
26+
for a != 0 {
27+
a, b = b%a, a
28+
}
29+
return b
30+
}

leetcode/258/b/b_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/258/c/c.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
// Go 爆搜
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
func maxProduct(s string) (ans int) {
7+
var a, b []byte
8+
var f func(int)
9+
f = func(i int) {
10+
if i == len(s) {
11+
if len(a)*len(b) > ans && isPalindromic(a) && isPalindromic(b) {
12+
ans = len(a) * len(b)
13+
}
14+
return
15+
}
16+
f(i + 1)
17+
a = append(a, s[i])
18+
f(i + 1)
19+
a = a[:len(a)-1]
20+
b = append(b, s[i])
21+
f(i + 1)
22+
b = b[:len(b)-1]
23+
}
24+
f(0)
25+
return
26+
}
27+
28+
func isPalindromic(a []byte) bool {
29+
for i, n := 0, len(a); i < n/2; i++ {
30+
if a[i] != a[n-1-i] {
31+
return false
32+
}
33+
}
34+
return true
35+
}

leetcode/258/c/c_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/258/d/d.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package main
2+
3+
// github.com/EndlessCheng/codeforces-go
4+
func smallestMissingValueSubtree(parents []int, a []int) []int {
5+
n := len(parents)
6+
g := make([][]int, n)
7+
for w := 1; w < n; w++ {
8+
v := parents[w]
9+
g[v] = append(g[v], w)
10+
}
11+
mex := make([]int, n)
12+
var f func(int) map[int]bool
13+
f = func(v int) map[int]bool {
14+
set := map[int]bool{}
15+
mex[v] = 1
16+
for _, w := range g[v] {
17+
s := f(w)
18+
if len(s) > len(set) {
19+
set, s = s, set
20+
}
21+
for x := range s {
22+
set[x] = true
23+
}
24+
if mex[w] > mex[v] {
25+
mex[v] = mex[w]
26+
}
27+
}
28+
set[a[v]] = true
29+
for set[mex[v]] {
30+
mex[v]++
31+
}
32+
return set
33+
}
34+
f(0)
35+
return mex
36+
}

leetcode/258/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)