2026-06-22不同频率的最小数对。用go语言给定一个整数数组 nums你需要从中找到两个不同的数 x 和 y要求 x 比 y 小而且它们在数组里出现的次数不一样。在所有符合条件的组合里先优先选择 x 尽可能小的那一组如果有多组的 x 一样再选择 y 尽可能小的那一组。最后返回这两个数组成的数组 [x, y]。如果根本找不到这样的两个数就返回 [-1, -1]。1 nums.length 100。1 nums[i] 100。输入 nums [1,1,2,2,3,4]。输出 [1,3]。解释最小的值是 1频率为 2。比 1 大且频率与 1 不同的最小值是 3其频率为 1。因此答案是 [1, 3]。题目来自力扣3852。一、代码完整分步执行过程步骤1遍历原数组统计数字频次、记录全局最小值x候选初始化空哈希映射cnt作用key数组数字value该数字出现次数初始化变量mn用来存全局最小数字赋值为整型最大值保证任意数组数字都能覆盖它逐个取出数组中每一个元素 x将该数字在映射表中的计数 1完成频次统计对比当前元素和mn如果当前数字更小就更新mn遍历结束后得到两个关键信息cnt完整记录数组所有不重复数字的出现次数mn整个数组里数值最小的数字也就是我们第一优先级要选的 x取出mn对应的出现次数存入变量cntMin即目标 x 的频次。以示例[1,1,2,2,3,4]举例频次映射结果1:22:23:14:1全局最小数字mn 1cntMin 2。步骤2遍历频次映射寻找满足条件的最小y要求 y 满足两点① y 的出现次数不等于cntMin② 后续要保证y mn初始化变量minY存储符合频次条件的最小数字赋值整型最大值遍历频次映射里每一组数字y对应频次c判断如果当前数字的频次 c ≠ cntMin和x频次不一样满足频次条件时对比当前y和minY若y更小更新minY本轮遍历结束后minY是全数组中频次和x不相等的所有数字里数值最小的那一个。示例遍历过程y1频次2 cntMin(2)跳过y2频次2 cntMin(2)跳过y3频次1 ≠ 2minY更新为3y4频次1 ≠ 24比3大不更新minY最终minY 3。步骤3合法性校验构造返回结果判断minY是否仍等于初始的整型最大值等于代表数组里所有数字的出现频次全部相同不存在符合要求的数对返回[-1, -1]不等于存在合法y此时mn minY天然成立因为mn是全局最小数字minY是另一个不同数字直接返回数组[mn, minY]。示例中 minY3 有效返回[1, 3]和题目输出一致。边界场景补充逻辑场景数组所有数字频次完全一致例如[5,5,6,6,7,7]mn5cntMin2遍历所有y5、6、7频次全是2minY保持最大值判定无合法数对返回[-1,-1]。二、时间复杂度分析设数组长度为 n数组中不重复数字的数量为 kk ≤ n。第一次遍历原数组循环 n 次单次哈希读写为 O(1)耗时 O(n)第二次遍历频次哈希表循环 k 次k最大等于n耗时 O(n)总操作两段线性遍历无嵌套循环。总时间复杂度O(n)三、额外空间复杂度分析额外开辟的存储空间只有哈希映射cnt最多存储 k 个键值对k ≤ n其余变量mn、cntMin、minY均为常数级固定空间不随数组长度变化。总额外空间复杂度O(n)最坏情况数组所有数字互不重复哈希表存储n组数据Go完整代码如下packagemainimport(fmtmath)funcminDistinctFreqPair(nums[]int)[]int{cnt:map[int]int{}mn:math.MaxIntfor_,x:rangenums{cnt[x]mnmin(mn,x)}cntMin:cnt[mn]minY:math.MaxIntfory,c:rangecnt{ifc!cntMin{minYmin(minY,y)}}ifminYmath.MaxInt{return[]int{-1,-1}}return[]int{mn,minY}}funcmain(){nums:[]int{1,1,2,2,3,4}result:minDistinctFreqPair(nums)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-fromtypingimportListimportmathdefmin_distinct_freq_pair(nums:List[int])-List[int]:# 统计频次cnt{}mnmath.infforxinnums:cnt[x]cnt.get(x,0)1mnmin(mn,x)# 获取最小值的频次cnt_mincnt[mn]# 找到频次不等于 cnt_min 的最小值min_ymath.inffory,cincnt.items():ifc!cnt_min:min_ymin(min_y,y)# 如果没找到返回 [-1, -1]ifmin_ymath.inf:return[-1,-1]return[mn,min_y]defmain():nums[1,1,2,2,3,4]resultmin_distinct_freq_pair(nums)print(result)if__name____main__:main()C完整代码如下#includeiostream#includevector#includeunordered_map#includeclimitsusingnamespacestd;vectorintminDistinctFreqPair(vectorintnums){unordered_mapint,intcnt;intmnINT_MAX;for(intx:nums){cnt[x];mnmin(mn,x);}intcntMincnt[mn];intminYINT_MAX;for(autop:cnt){intyp.first;intcp.second;if(c!cntMin){minYmin(minY,y);}}if(minYINT_MAX){return{-1,-1};}return{mn,minY};}intmain(){vectorintnums{1,1,2,2,3,4};vectorintresultminDistinctFreqPair(nums);cout[result[0], result[1]]endl;return0;}