JNH资讯

你的位置:金年会(JinNianHui)体育官网 > JNH资讯 > 金年会官网首页入口 2026-03-28: 三个相配元素之间的最小距离Ⅰ。用go讲话, 给定一个


金年会官网首页入口 2026-03-28: 三个相配元素之间的最小距离Ⅰ。用go讲话, 给定一个

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

金年会官网首页入口 2026-03-28: 三个相配元素之间的最小距离Ⅰ。用go讲话, 给定一个

如若存在三个互不雷同的位置 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(中国)官网

上一篇:金年会官网首页入口 无东说念主机行业暗战, 大疆若何捍卫其时间壁垒与学问产权
下一篇:金年会体育 小米汽车成比亚迪电板最大外供客户, 2月装机量占比17.9%

Copyright © 1998-2026 金年会(JinNianHui)体育官网™版权所有

jxyrwl.com 备案号 备案号: 赣ICP备17001964号-1

技术支持:®金年会  RSS地图 HTML地图