Skip to content

Commit 52ada67

Browse files
committed
Add LeetCode Weekly Contest 273
1 parent 7164972 commit 52ada67

File tree

8 files changed

+210
-0
lines changed

8 files changed

+210
-0
lines changed

leetcode/weekly/273/a/a.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package main
2+
3+
// 一行
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
func isSameAfterReversals(num int) bool {
7+
return num == 0 || num%10 > 0
8+
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package main
2+
3+
// github.com/EndlessCheng/codeforces-go
4+
var dirs = [][2]int{'L': {0, -1}, 'R': {0, 1}, 'U': {-1, 0}, 'D': {1, 0}}
5+
6+
func executeInstructions(n int, startPos []int, s string) []int {
7+
ans := make([]int, len(s))
8+
for i := range s {
9+
ans[i] = len(s) - i
10+
x, y := startPos[0], startPos[1]
11+
for j, ch := range s[i:] {
12+
x += dirs[ch][0]
13+
y += dirs[ch][1]
14+
if x < 0 || x >= n || y < 0 || y >= n {
15+
ans[i] = j
16+
break
17+
}
18+
}
19+
}
20+
return ans
21+
}

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main
2+
3+
// O(n) 做法:哈希表 + 枚举相同元素
4+
5+
// github.com/EndlessCheng/codeforces-go
6+
func getDistances(arr []int) []int64 {
7+
pos := map[int][]int{}
8+
for i, v := range arr {
9+
pos[v] = append(pos[v], i) // 记录相同元素的位置
10+
}
11+
ans := make([]int64, len(arr))
12+
for _, p := range pos {
13+
sum := 0
14+
for _, i := range p {
15+
sum += i - p[0]
16+
}
17+
ans[p[0]] = int64(sum) // 最左侧元素的间隔和
18+
for i, n := 1, len(p); i < n; i++ { // 计算下一个相同元素的间隔和
19+
sum -= (n - i*2) * (p[i] - p[i-1]) // 到右边的 n-i 个点的距离更近了,同时到左边 i 个点的距离更远了
20+
ans[p[i]] = int64(sum)
21+
}
22+
}
23+
return ans
24+
}

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package main
2+
3+
import "sort"
4+
5+
/* 枚举 higher[0] + 双指针
6+
7+
将 $\textit{nums}$ 排序后,$\textit{lower}[0]$ 必然是 $\textit{nums}[0]$。我们可以在 $\textit{nums}$ 中枚举 $\textit{higher}[0]$ 的值,从而得到 $k=\dfrac{\textit{higher}[0]-\textit{lower}[0]}{2}$。
8+
9+
由于 $\textit{higher}[i]-\textit{lower}[i]=2k$ 是个定值,我们可以用双指针去遍历 $\textit{nums}$,计算其余的 $\textit{lower}$ 和 $\textit{higher}$ 的元素值。
10+
11+
细节见代码注释。
12+
13+
*/
14+
15+
// github.com/EndlessCheng/codeforces-go
16+
func recoverArray(nums []int) []int {
17+
sort.Ints(nums)
18+
for i, n := 1, len(nums); ; i++ {
19+
d := nums[i] - nums[0]
20+
if d == 0 || d&1 > 0 { continue } // 必须保证 k 是正整数
21+
k := d / 2
22+
vis := make([]bool, n) // 用来标记出现在 higher 中的数
23+
vis[i] = true
24+
ans := []int{(nums[0] + nums[i]) / 2}
25+
for lo, hi := 0, i+1; hi < n; hi++ { // 双指针:lo 指向 lower,hi 指向 higher
26+
for lo++; lo < n && vis[lo]; lo++ {} // 跳过出现在 higher 中的数
27+
for ; hi < n && nums[hi]-nums[lo] < 2*k; hi++ {}
28+
if hi == n || nums[hi]-nums[lo] > 2*k { break }
29+
vis[hi] = true
30+
ans = append(ans, (nums[lo]+nums[hi])/2)
31+
}
32+
if len(ans) == n/2 { return ans }
33+
}
34+
}

leetcode/weekly/273/d/d_test.go

Lines changed: 34 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)