Skip to content

Commit d7799bf

Browse files
authored
feat: add weekly contest 475 (#4824)
1 parent 9a40cd4 commit d7799bf

File tree

29 files changed

+2235
-2
lines changed

29 files changed

+2235
-2
lines changed
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
---
2+
comments: true
3+
difficulty: 简单
4+
edit_url: https://github.com/doocs/leetcode/edit/main/solution/3700-3799/3740.Minimum%20Distance%20Between%20Three%20Equal%20Elements%20I/README.md
5+
---
6+
7+
<!-- problem:start -->
8+
9+
# [3740. 三个相等元素之间的最小距离 I](https://leetcode.cn/problems/minimum-distance-between-three-equal-elements-i)
10+
11+
[English Version](/solution/3700-3799/3740.Minimum%20Distance%20Between%20Three%20Equal%20Elements%20I/README_EN.md)
12+
13+
## 题目描述
14+
15+
<!-- description:start -->
16+
17+
<p>给你一个整数数组 <code>nums</code>。</p>
18+
19+
<p>如果满足 <code>nums[i] == nums[j] == nums[k]</code>,且 <code>(i, j, k)</code> 是 3 个&nbsp;<strong>不同&nbsp;</strong>下标,那么三元组 <code>(i, j, k)</code> 被称为&nbsp;<strong>有效三元组&nbsp;</strong>。</p>
20+
21+
<p><strong>有效三元组&nbsp;</strong>的&nbsp;<strong>距离&nbsp;</strong>被定义为 <code>abs(i - j) + abs(j - k) + abs(k - i)</code>,其中 <code>abs(x)</code> 表示 <code>x</code> 的&nbsp;<strong>绝对值&nbsp;</strong>。</p>
22+
23+
<p>返回一个整数,表示 <strong>有效三元组&nbsp;</strong>的&nbsp;<strong>最小&nbsp;</strong>可能距离。如果不存在&nbsp;<strong>有效三元组&nbsp;</strong>,返回 <code>-1</code>。</p>
24+
25+
<p>&nbsp;</p>
26+
27+
<p><strong class="example">示例 1:</strong></p>
28+
29+
<div class="example-block">
30+
<p><strong>输入:</strong> <span class="example-io">nums = [1,2,1,1,3]</span></p>
31+
32+
<p><strong>输出:</strong> <span class="example-io">6</span></p>
33+
34+
<p><strong>解释:</strong></p>
35+
36+
<p>最小距离对应的有效三元组是&nbsp;<code>(0, 2, 3)</code>&nbsp;。</p>
37+
38+
<p><code>(0, 2, 3)</code> 是一个有效三元组,因为 <code>nums[0] == nums[2] == nums[3] == 1</code>。它的距离为 <code>abs(0 - 2) + abs(2 - 3) + abs(3 - 0) = 2 + 1 + 3 = 6</code>。</p>
39+
</div>
40+
41+
<p><strong class="example">示例 2:</strong></p>
42+
43+
<div class="example-block">
44+
<p><strong>输入:</strong> <span class="example-io">nums = [1,1,2,3,2,1,2]</span></p>
45+
46+
<p><strong>输出:</strong> <span class="example-io">8</span></p>
47+
48+
<p><strong>解释:</strong></p>
49+
50+
<p>最小距离对应的有效三元组是&nbsp;<code>(2, 4, 6)</code>&nbsp;。</p>
51+
52+
<p><code>(2, 4, 6)</code> 是一个有效三元组,因为 <code>nums[2] == nums[4] == nums[6] == 2</code>。它的距离为 <code>abs(2 - 4) + abs(4 - 6) + abs(6 - 2) = 2 + 2 + 4 = 8</code>。</p>
53+
</div>
54+
55+
<p><strong class="example">示例 3:</strong></p>
56+
57+
<div class="example-block">
58+
<p><strong>输入:</strong> <span class="example-io">nums = [1]</span></p>
59+
60+
<p><strong>输出:</strong> <span class="example-io">-1</span></p>
61+
62+
<p><strong>解释:</strong></p>
63+
64+
<p>不存在有效三元组,因此答案为 -1。</p>
65+
</div>
66+
67+
<p>&nbsp;</p>
68+
69+
<p><strong>提示:</strong></p>
70+
71+
<ul>
72+
<li><code>1 &lt;= n == nums.length &lt;= 100</code></li>
73+
<li><code>1 &lt;= nums[i] &lt;= n</code></li>
74+
</ul>
75+
76+
<!-- description:end -->
77+
78+
## 解法
79+
80+
<!-- solution:start -->
81+
82+
### 方法一:哈希表
83+
84+
我们可以使用一个哈希表 $\textit{g}$ 来存储数组中每个数字对应的下标列表。遍历数组时,将每个数字的下标添加到哈希表中对应的列表中。定义一个变量 $\textit{ans}$ 来存储答案,初始值设为无穷大 $\infty$。
85+
86+
接下来,我们遍历哈希表中的每个下标列表。如果某个数字的下标列表长度大于等于 $3$,则说明存在有效三元组。要使得距离最小,我们可以选择该数字下标列表中相邻的三个下标 $i$、$j$ 和 $k$,假设 $i \lt; j \lt; k$,则该三元组的距离为 $j - i + k - j + k - i = 2 \times (k - i)$。我们遍历该下表列表所有相邻的三个下标组合,计算距离并更新答案。
87+
88+
最终,如果答案仍然是初始值 $\infty$,则说明不存在有效三元组,返回 $-1$;否则返回计算得到的最小距离。
89+
90+
时间复杂度 $O(n)$,空间复杂度 $O(n)$,其中 $n$ 是数组的长度。
91+
92+
<!-- tabs:start -->
93+
94+
#### Python3
95+
96+
```python
97+
class Solution:
98+
def minimumDistance(self, nums: List[int]) -> int:
99+
g = defaultdict(list)
100+
for i, x in enumerate(nums):
101+
g[x].append(i)
102+
ans = inf
103+
for ls in g.values():
104+
for h in range(len(ls) - 2):
105+
i, k = ls[h], ls[h + 2]
106+
ans = min(ans, (k - i) * 2)
107+
return -1 if ans == inf else ans
108+
```
109+
110+
#### Java
111+
112+
```java
113+
class Solution {
114+
public int minimumDistance(int[] nums) {
115+
int n = nums.length;
116+
Map<Integer, List<Integer>> g = new HashMap<>();
117+
for (int i = 0; i < n; ++i) {
118+
g.computeIfAbsent(nums[i], k -> new ArrayList<>()).add(i);
119+
}
120+
final int inf = 1 << 30;
121+
int ans = inf;
122+
for (var ls : g.values()) {
123+
int m = ls.size();
124+
for (int h = 0; h < m - 2; ++h) {
125+
int i = ls.get(h);
126+
int k = ls.get(h + 2);
127+
int t = (k - i) * 2;
128+
ans = Math.min(ans, t);
129+
}
130+
}
131+
return ans == inf ? -1 : ans;
132+
}
133+
}
134+
```
135+
136+
#### C++
137+
138+
```cpp
139+
class Solution {
140+
public:
141+
int minimumDistance(vector<int>& nums) {
142+
int n = nums.size();
143+
unordered_map<int, vector<int>> g;
144+
for (int i = 0; i < n; ++i) {
145+
g[nums[i]].push_back(i);
146+
}
147+
const int inf = 1 << 30;
148+
int ans = inf;
149+
for (auto& [_, ls] : g) {
150+
int m = ls.size();
151+
for (int h = 0; h < m - 2; ++h) {
152+
int i = ls[h];
153+
int k = ls[h + 2];
154+
int t = (k - i) * 2;
155+
ans = min(ans, t);
156+
}
157+
}
158+
return ans == inf ? -1 : ans;
159+
}
160+
};
161+
```
162+
163+
#### Go
164+
165+
```go
166+
func minimumDistance(nums []int) int {
167+
g := make(map[int][]int)
168+
for i, x := range nums {
169+
g[x] = append(g[x], i)
170+
}
171+
172+
inf := 1 << 30
173+
ans := inf
174+
175+
for _, ls := range g {
176+
m := len(ls)
177+
for h := 0; h < m-2; h++ {
178+
i := ls[h]
179+
k := ls[h+2]
180+
t := (k - i) * 2
181+
ans = min(ans, t)
182+
}
183+
}
184+
185+
if ans == inf {
186+
return -1
187+
}
188+
return ans
189+
}
190+
```
191+
192+
#### TypeScript
193+
194+
```ts
195+
function minimumDistance(nums: number[]): number {
196+
const n = nums.length;
197+
const g = new Map<number, number[]>();
198+
199+
for (let i = 0; i < n; i++) {
200+
if (!g.has(nums[i])) {
201+
g.set(nums[i], []);
202+
}
203+
g.get(nums[i])!.push(i);
204+
}
205+
206+
const inf = 1 << 30;
207+
let ans = inf;
208+
209+
for (const ls of g.values()) {
210+
const m = ls.length;
211+
for (let h = 0; h < m - 2; h++) {
212+
const i = ls[h];
213+
const k = ls[h + 2];
214+
const t = (k - i) * 2;
215+
ans = Math.min(ans, t);
216+
}
217+
}
218+
219+
return ans === inf ? -1 : ans;
220+
}
221+
```
222+
223+
<!-- tabs:end -->
224+
225+
<!-- solution:end -->
226+
227+
<!-- problem:end -->

0 commit comments

Comments
 (0)