JNH资讯
发布日期:2026-03-29 07:45 点击次数:103

如若存在三个互不雷同的位置 i、j、k,何况满足 nums[i] = nums[j] = nums[k],那么这三个下标构成的三元组 (i, j, k) 称为灵验三元组。
关于随便一个灵验三元组,它的距离界说为:
你需要在扫数灵验三元组中找出距离的最小值并复返。
如若数组中根底找不到灵验三元组,则复返 -1。
1
1
输入: 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,1]),
那么这三个下标便是纠合的,盘算出的距离一定是最小的固定值 4,
班师断绝扫数历程,复返 4 即可。
原因:纠合三个雷同元素的下标差最小,盘算出的距离是扫数可能里最小的,无需再盘算其他情况。
格局2:记载每个数字出现的扫数下标
创建一个「映射表」:
• 键:数组中的数字
• 值:该数字扫数出现位置的下标列表(按从小到大功令存储)
例如:输入 [1,2,ued官方网站1,1,3]
映射表禁止:
惟有下标列表长度 ≥3 的数字,才可能酿成灵验三元组。
格局3:遍历扫数可能酿成灵验三元组的数字
只处罚映射表中「下标数目 ≥3」的数字,其他数字班师跳过。
格局4:对每个数字的下标列表,盘算最小三元组距离
因为下标是从小到大有序的,金年会灵验三元组一定是纠合的三个下标(非纠合的下标差更大,距离也更大):
• 取第 0、1、2 个下标
• 取第 1、2、3 个下标
• 取第 2、3、4 个下标……
依此类推。
对每一组纠合三个下标,用简化公式盘算:
距离 = 2 × (最大下标 - 最小下标)
并记载扫数盘算禁止中的最小值。
例如:数字 1 的下标 [0,2,3]
独一一组纠合三个下标:0、2、3
距离 = 2 × (3 - 0) = 6
格局5:最终禁止判断
1. 如若找到灵验三元组:复返记载的最小距离
2. 如若莫得任何灵验三元组:复返 -1
本题齐全实践演示(输入 [1,2,1,1,3])
1. 遍历数组,莫得纠合三个雷同元素,快速判断不触发
2. 记载下标:1→[0,2,3],2→[1],3→[4]
3. 惟很是字 1 有 ≥3 个下标
4. 盘算独一三元组 [0,2,3]:距离=2×(3-0)=6
5. 最小距离为 6,复返 6
时刻复杂度 & 很是空间复杂度
1. 总时刻复杂度
O(n)
• 遍历数组记载下标:实践 n 次操作
• 遍历映射表盘算距离:所很是字的下标总额加起来便是 n,总操作不跨越 n
• 合座操作次数与数组长度 n 成正比
2. 总很是空间复杂度
O(n)
• 用到的映射表,最坏情况下(数组所很是字皆不同),存储 n 个键值对
• 占用的很是空间与数组长度 n 成正比
转头
1. 解题中枢:先快速判断纠合三元素,再记载数字下标,用有序纠合下标盘算最小距离;
2. 时刻复杂度:O(n)(线性时刻);
3. 很是空间复杂度:O(n)(线性空间)。
Go齐全代码如下:
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
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)
}

Python齐全代码如下:
# -*-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)

C++齐全代码如下:
#include
#include
#include
#include
#include
using namespace std;
int minimumDistance(vector& nums) {
unordered_map> pos;
for (int i = 0; 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& p = entry.second;
for (int i = 2; i
ans = min(ans, (p[i] - p[i-2]) * 2);
}
}
if (ans == INT_MAX) {
return-1;
}
return ans;
}
int main {
vector nums = {1, 2, 1, 1, 3};
int result = minimumDistance(nums);
cout
return0;
}

咱们服气东谈主工智能为闲居东谈主提供了一种“增强器具”,并尽力于于共享全倡导的AI常识。在这里,您不错找到最新的AI科普著作、器具评测、莳植恶果的狡饰以及行业洞悉。
接待存眷“福大大架构师逐日一题”金年会官网首页入口,发音问可获取口试良友,让AI助力您的翌日发展。
滔博体育TBO(中国)官网