Skip to content

Commit 3cb0529

Browse files
committed
Add LeetCode Weekly Contest 272
1 parent 1f5b3f1 commit 3cb0529

File tree

8 files changed

+239
-0
lines changed

8 files changed

+239
-0
lines changed

leetcode/weekly/272/a/a.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package main
2+
3+
// 遍历,找第一个回文串
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
func firstPalindrome(words []string) string {
7+
next:
8+
for _, w := range words {
9+
for i, n := 0, len(w); i < n/2; i++ {
10+
if w[i] != w[n-1-i] {
11+
continue next
12+
}
13+
}
14+
return w
15+
}
16+
return ""
17+
}

leetcode/weekly/272/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/weekly/272/b/b.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package main
2+
3+
// Go 模拟
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
func addSpaces(s string, spaces []int) string {
7+
spaces = append(spaces, len(s)) // 小技巧:把 s 长度加到数组末尾,这样可以在循环内处理最后一段
8+
ans := []byte(s[:spaces[0]])
9+
for i := 1; i < len(spaces); i++ {
10+
ans = append(ans, ' ')
11+
ans = append(ans, s[spaces[i-1]:spaces[i]]...)
12+
}
13+
return string(ans)
14+
}
15+
16+
// github.com/EndlessCheng/codeforces-go
17+
func addSpaces2(s string, spaces []int) string {
18+
ans := make([]byte, 0, len(s)+len(spaces))
19+
ans = append(ans, s[:spaces[0]]...)
20+
for i := 1; i < len(spaces); i++ {
21+
ans = append(ans, ' ')
22+
ans = append(ans, s[spaces[i-1]:spaces[i]]...)
23+
}
24+
ans = append(ans, ' ')
25+
ans = append(ans, s[spaces[len(spaces)-1]:]...)
26+
return string(ans)
27+
}

leetcode/weekly/272/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/weekly/272/c/c.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package main
2+
3+
/* 分组循环
4+
5+
将 $\textit{prices}$ 按照平滑下降的定义分成若干组。例如 $[3,2,1,4]$ 分为 $[3,2,1]$ 和 $[4]$ 两组。
6+
7+
对于每一组的所有非空子数组,都是平滑下降的。设该组长度为 $m$,则该组的非空子数组个数为
8+
9+
$$
10+
C_{m+1}^2 = \dfrac{m(m+1)}{2}
11+
$$
12+
13+
累加每组的非空子区间个数即为答案。
14+
15+
- 时间复杂度:$O(n)$,其中 $n$ 是数组 $\textit{prices}$ 的长度。注意下面代码内外层循环共用同一个变量 $i$,时间复杂度就是 `i++` 的执行次数,即 $O(n)$。
16+
- 空间复杂度:$O(1)$,我们只需要常数的空间保存若干变量。
17+
18+
*/
19+
20+
// github.com/EndlessCheng/codeforces-go
21+
func getDescentPeriods(prices []int) (ans int64) {
22+
for i, n := 0, len(prices); i < n; {
23+
i0 := i
24+
for i++; i < n && prices[i] == prices[i-1]-1; i++ {
25+
}
26+
ans += int64(i-i0) * int64(i-i0+1) / 2
27+
}
28+
return
29+
}

leetcode/weekly/272/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/weekly/272/d/d.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package main
2+
3+
import "sort"
4+
5+
/* 最长上升子序列
6+
7+
将 $\textit{arr}$ 每隔 $k$ 个数取一个元素,分为若干组,例如当 $k=3$ 时,分为如下三组:
8+
9+
- $arr[0],arr[3],arr[6],\cdots$
10+
- $arr[1],arr[4],arr[7],\cdots$
11+
- $arr[2],arr[5],arr[8],\cdots$
12+
13+
根据题意,组与组之间是互不影响的,我们需要让每一组内的元素单调不降。
14+
15+
题目要求需要修改的最少元素个数,这可以通过求不需要修改的最多元素个数来求出,也就是该组元素的最长不降子序列。(不了解的同学可以看看第 300 题)
16+
17+
需要注意的是:
18+
19+
- 求最长严格递增子序列需要二分找到大于或等于当前元素的元素位置(即 C++ 中的 `lower_bound`);
20+
- 求最长非降子序列需要二分找到大于当前元素的元素位置(即 C++ 中的 `upper_bound`)。
21+
22+
累加所有组的最长不降子序列的长度即为最多可以保留的元素个数,用 $\textit{arr}$ 的长度减去该个数即为答案。
23+
24+
*/
25+
26+
// github.com/EndlessCheng/codeforces-go
27+
func kIncreasing(arr []int, k int) int {
28+
save := 0
29+
for i, n := 0, len(arr); i < k && i < n; i++ {
30+
f := []int{}
31+
for j := i; j < n; j += k {
32+
v := arr[j]
33+
if p := sort.SearchInts(f, v+1); p < len(f) {
34+
f[p] = v
35+
} else {
36+
f = append(f, v)
37+
}
38+
}
39+
save += len(f)
40+
}
41+
return len(arr) - save
42+
}

leetcode/weekly/272/d/d_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.

0 commit comments

Comments
 (0)