
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。
last = [-6, -6]:last[0]存最近1的下标,last[1]存最近2的下标,初始值-6。x不大于0,直接跳过所有计算逻辑,last数组、ans均无变化。
x不大于0,直接跳过所有计算逻辑,last数组、ans均无变化。
x不大于0,直接跳过所有计算逻辑,last数组、ans均无变化。
遍历完成后 ans=2,ans不等于初始值n=6,说明存在有效1、2配对,直接返回ans=2,和题目输出一致。
如果数组只有1没有2 / 只有2没有1:遍历全程不会同时出现1和2,ans会一直等于初始值n,此时函数返回-1。
.
package main
import (
"fmt"
)
func minAbsoluteDifference(nums []int)int {
n := len(nums)
ans := n
// last[x] 表示 x+1 上一次出现的位置
last := [2]int{-n, -n} // i - (-n) >= n,不会让 ans 变小
for i, x := range nums {
if x > 0 {
// 如果 x 是 1,那么找上一个 2 的位置
// 如果 x 是 2,那么找上一个 1 的位置
x--
ans = min(ans, i-last[x^1])
last[x] = i
}
}
if ans == n {
return-1
}
return ans
}
func main() {
nums := []int{1, 0, 0, 2, 0, 1}
result := minAbsoluteDifference(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
from typing import List
def min_absolute_difference(nums: List[int]) -> int:
n = len(nums)
ans = n
# last[x] 表示 x+1 上一次出现的位置
last = [-n, -n] # i - (-n) >= n,不会让 ans 变小
for i, x in enumerate(nums):
if x > 0:
# 如果 x 是 1,那么找上一个 2 的位置
# 如果 x 是 2,那么找上一个 1 的位置
x -= 1
ans = min(ans, i - last[x ^ 1])
last[x] = i
if ans == n:
return-1
return ans
def main():
nums = [1, 0, 0, 2, 0, 1]
result = min_absolute_difference(nums)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int minAbsoluteDifference(vector<int>& nums) {
int n = nums.size();
int ans = n;
// last[x] 表示 x+1 上一次出现的位置
int last[2] = {-n, -n}; // i - (-n) >= n,不会让 ans 变小
for (int i = 0; i < n; i++) {
int x = nums[i];
if (x > 0) {
// 如果 x 是 1,那么找上一个 2 的位置
// 如果 x 是 2,那么找上一个 1 的位置
x--;
ans = min(ans, i - last[x ^ 1]);
last[x] = i;
}
}
if (ans == n) {
return-1;
}
return ans;
}
int main() {
vector<int> nums = {1, 0, 0, 2, 0, 1};
int result = minAbsoluteDifference(nums);
cout << result << endl;
return0;
}

·