
2026-03-28:三个相等元素之间的最小距离Ⅰ。用go语言,给定一个整数数组 nums。
如果存在三个互不相同的位置 i、j、k,并且满足 nums[i] = nums[j] = nums[k],那么这三个下标组成的三元组 (i, j, k) 称为有效三元组。
对于任意一个有效三元组,它的距离定义为:
|i - j| + |j - k| + |k - i|
其中 |x| 表示 x 的绝对值。
你需要在所有有效三元组中找出距离的最小值并返回。
如果数组中根本找不到有效三元组,则返回 -1。
1 <= n == nums.length <= 100。
1 <= nums[i] <= n。
输入: nums = [1,2,1,1,3]。
输出: 6。
解释:
最小距离对应的有效三元组是 (0, 2, 3) 。
(0, 2, 3) 是一个有效三元组,因为 nums[0] == nums[2] == nums[3] == 1。它的距离为 abs(0 - 2) + abs(2 - 3) + abs(3 - 0) = 2 + 1 + 3 = 6。
题目来自力扣3740。
从头开始逐个遍历数组元素,同时做一个快速判断:
如果发现连续三个元素完全相同(比如 [1,1,1]),
那么这三个下标就是连续的,计算出的距离一定是最小的固定值 4,
直接终止所有流程,返回 4 即可。
原因:连续三个相同元素的下标差最小,计算出的距离是所有可能里最小的,无需再计算其他情况。
创建一个「映射表」:
举例:输入 [1,2,1,1,3]
映射表结果:
只有下标列表长度 ≥3 的数字,才可能形成有效三元组。
只处理映射表中「下标数量 ≥3」的数字,其他数字直接跳过。
因为下标是从小到大有序的,有效三元组一定是连续的三个下标(非连续的下标差更大,距离也更大):
对每一组连续三个下标,用简化公式计算: 距离 = 2 × (最大下标 - 最小下标) 并记录所有计算结果中的最小值。
举例:数字 1 的下标 [0,2,3] 唯一一组连续三个下标:0、2、3 距离 = 2 × (3 - 0) = 6
O(n)
O(n)
.
package main
import (
"fmt"
"math"
)
func minimumDistance(nums []int)int {
pos := map[int][]int{}
for i, x := range nums {
if i >= 2 && x == nums[i-1] && x == nums[i-2] {
return4
}
pos[x] = append(pos[x], i)
}
ans := math.MaxInt
for _, p := range pos {
for i := 2; i < len(p); i++ {
ans = min(ans, (p[i]-p[i-2])*2)
}
}
if ans == math.MaxInt {
return-1
}
return ans
}
func main() {
nums := []int{1, 2, 1, 1, 3}
result := minimumDistance(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
from typing import List
def minimumDistance(nums: List[int]) -> int:
pos = {}
for i, x in enumerate(nums):
# 检查是否有三个连续相同的元素
if i >= 2 and x == nums[i-1] and x == nums[i-2]:
return4
if x not in pos:
pos[x] = []
pos[x].append(i)
ans = float('inf')
for p in pos.values():
for i in range(2, len(p)):
ans = min(ans, (p[i] - p[i-2]) * 2)
if ans == float('inf'):
return-1
return ans
if __name__ == "__main__":
nums = [1, 2, 1, 1, 3]
result = minimumDistance(nums)
print(result)
.
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <climits>
using namespace std;
int minimumDistance(vector<int>& nums) {
unordered_map<int, vector<int>> pos;
for (int i = 0; i < nums.size(); i++) {
int x = nums[i];
// 检查连续三个相同元素
if (i >= 2 && x == nums[i-1] && x == nums[i-2]) {
return4;
}
pos[x].push_back(i);
}
int ans = INT_MAX;
for (auto& entry : pos) {
vector<int>& p = entry.second;
for (int i = 2; i < p.size(); i++) {
ans = min(ans, (p[i] - p[i-2]) * 2);
}
}
if (ans == INT_MAX) {
return-1;
}
return ans;
}
int main() {
vector<int> nums = {1, 2, 1, 1, 3};
int result = minimumDistance(nums);
cout << result << endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·