公司动态
2026-07-14:两个值之间的最小绝对差值。用go语言,给定一个只由 0、1、2 组成的整数数组 nums。 我们要找所有满足条件的下标对(i, j),其中当 nums[i] 等于 1,且 num
2026-07-14两个值之间的最小绝对差值。用go语言给定一个只由 0、1、2 组成的整数数组 nums。我们要找所有满足条件的下标对i, j其中当 nums[i] 等于 1且 nums[j] 等于 2 时这样的i, j被称为“有效下标对”。在所有有效下标对之中计算每一对的下标差|i - j|。要求返回这些有效下标对里“最小的下标差”。如果数组中根本不存在任何有效下标对即不存在某个 i 使得 nums[i]1 同时存在某个 j 使得 nums[j]2则返回 -1。1 nums.length 100。0 nums[i] 2。输入 nums [1,0,0,2,0,1]。输出 2。解释有效下标对有(0, 3)其绝对差为 abs(0 - 3) 3。(5, 3)其绝对差为 abs(5 - 3) 2。因此结果是 2。题目来自力扣3880。一、分步详细执行过程步骤1初始化基础变量计算数组长度 n 6定义答案变量 ans n 6用数组长度作为初始最大值后续找到更小差值就覆盖初始化last [-6, -6]last[0]存最近1的下标last[1]存最近2的下标初始值-6。步骤2逐个遍历数组每个元素下标i从0到5第1轮i0元素x1判断 x0满足条件进入逻辑x x-1 0计算对立编号x^1 0^1 1取出 last[1] -6计算差值 i - last[1] 0 - (-6) 6执行 min(ans6, 6)ans 保持6不变更新 last[0] i 0现在 last [0, -6]记录下标0是最近出现的1。第2轮i1元素x0x不大于0直接跳过所有计算逻辑last数组、ans均无变化。第3轮i2元素x0x不大于0直接跳过所有计算逻辑last数组、ans均无变化。第4轮i3元素x2判断 x0满足条件进入逻辑x x-1 1计算对立编号x^1 1^1 0取出 last[0] 0计算差值 i - last[0] 3 - 0 3执行 min(ans6, 3)ans 更新为3更新 last[1] i 3现在 last [0, 3]记录下标3是最近出现的2。第5轮i4元素x0x不大于0直接跳过所有计算逻辑last数组、ans均无变化。第6轮i5元素x1判断 x0满足条件进入逻辑x x-1 0计算对立编号x^1 0^1 1取出 last[1] 3计算差值 i - last[1] 5 - 3 2执行 min(ans3, 2)ans 更新为2更新 last[0] i 5现在 last [5, 3]更新最近出现1的下标为5。步骤3遍历结束后判断返回值遍历完成后 ans2ans不等于初始值n6说明存在有效1、2配对直接返回ans2和题目输出一致。补充边界场景逻辑不存在有效配对如果数组只有1没有2 / 只有2没有1遍历全程不会同时出现1和2ans会一直等于初始值n此时函数返回-1。二、时间复杂度分析数组仅进行单层一次遍历数组长度为n循环执行n次循环内部所有操作数值转换、异或、取值、求最小值、数组赋值全部是常数级 O(1) 运算整体时间复杂度O(n)n为输入数组长度。三、额外空间复杂度分析仅固定开辟了两个变量n、ans固定长度数组 last长度恒等于2和输入数组长度n无关属于常数空间没有动态数组、切片、哈希表等随n增大而扩容的存储整体额外空间复杂度O(1)常数空间。Go完整代码如下packagemainimport(fmt)funcminAbsoluteDifference(nums[]int)int{n:len(nums)ans:n// last[x] 表示 x1 上一次出现的位置last:[2]int{-n,-n}// i - (-n) n不会让 ans 变小fori,x:rangenums{ifx0{// 如果 x 是 1那么找上一个 2 的位置// 如果 x 是 2那么找上一个 1 的位置x--ansmin(ans,i-last[x^1])last[x]i}}ifansn{return-1}returnans}funcmain(){nums:[]int{1,0,0,2,0,1}result:minAbsoluteDifference(nums)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-fromtypingimportListdefmin_absolute_difference(nums:List[int])-int:nlen(nums)ansn# last[x] 表示 x1 上一次出现的位置last[-n,-n]# i - (-n) n不会让 ans 变小fori,xinenumerate(nums):ifx0:# 如果 x 是 1那么找上一个 2 的位置# 如果 x 是 2那么找上一个 1 的位置x-1ansmin(ans,i-last[x^1])last[x]iifansn:return-1returnansdefmain():nums[1,0,0,2,0,1]resultmin_absolute_difference(nums)print(result)if__name____main__:main()C完整代码如下#includeiostream#includevector#includealgorithmusingnamespacestd;intminAbsoluteDifference(vectorintnums){intnnums.size();intansn;// last[x] 表示 x1 上一次出现的位置intlast[2]{-n,-n};// i - (-n) n不会让 ans 变小for(inti0;in;i){intxnums[i];if(x0){// 如果 x 是 1那么找上一个 2 的位置// 如果 x 是 2那么找上一个 1 的位置x--;ansmin(ans,i-last[x^1]);last[x]i;}}if(ansn){return-1;}returnans;}intmain(){vectorintnums{1,0,0,2,0,1};intresultminAbsoluteDifference(nums);coutresultendl;return0;}