
要是存在三个互不雷同的位置 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,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助力您的翌日发展。
相关词条:管道保温 塑料管材生产线 锚索 玻璃棉毡 PVC管道管件粘结胶1.本网站以及本平台支持关于《新广告法》实施的“极限词“用语属“违词”的规定,并在网站的各个栏目、产品主图、详情页等描述中规避“违禁词”。
2.本店欢迎所有用户指出有“违禁词”“广告法”出现的地方,并积极配合修改。
3.凡用户访问本网页,均表示默认详情页的描述商洛储罐保温施工,不支持任何以极限化“违禁词”“广告法”为借口理由投诉违反《新广告法》,以此来变相勒索商家索要赔偿的违法恶意行为。
Powered by 湖北铁皮保温施工_鑫诚防腐保温工程有限公司 RSS地图 HTML地图
Copyright Powered by365建站 © 2025-2034