
2026-06-15:频率唯一的第一个元素。用go语言,从左到右扫描数组,统计每个元素出现的次数。对每个元素判断它的出现频率是否与其他元素不同:也就是它的出现次数在所有元素中是唯一的那种。找到最先满足这种“频率唯一”的元素并返回它;如果没有任何元素满足条件,则返回 -1。
1 <= nums.length <= 100000。
1 <= nums[i] <= 100000。
输入: nums = [20,10,30,30]。
输出: 30。
解释:
20 出现了 1 次。
10 出现了 1 次。
30 出现了 2 次。
30 的出现频率是唯一的,因为没有其他整数恰好出现 2 次。
题目来自力扣3843。
cnt,用于记录每个数字出现多少次。[20,10,30,30] 举例,遍历完成后哈希映射存储结果:cc,数组长度等于原数组长度+1。原因:一个数字最多完整铺满整个数组,最大出现次数不会超过原数组长度,数组下标可以直接代表“出现次数”,数组存储值代表“有多少个数字拥有该出现次数”。cnt 的每一个计数值(也就是各个数字的出现次数):cc 数组位置的值 +1;含义是:拥有该出现次数的数字数量增加一个。cc 数组关键位置结果:cnt 取出它的出现次数;cc 数组的值:cc[1]=2,不等于1,不满足;cc[1]=2,不等于1,不满足;cc[2]=1,等于1,满足条件,直接返回30;cc[次数]>1),说明不存在频率唯一的元素,最终返回-1。cnt:最坏情况所有数字不重复,存储n个键值对,占用 ;cc:长度固定为 ,占用 ;
无其他随输入规模线性增长的临时存储,总额外空间复杂度:。.
package main
import (
"fmt"
)
func firstUniqueFreq(nums []int)int {
cnt := map[int]int{}
for _, x := range nums {
cnt[x]++
}
cc := make([]int, len(nums)+1)
for _, c := range cnt {
cc[c]++
}
for _, x := range nums {
if cc[cnt[x]] == 1 {
return x
}
}
return-1
}
func main() {
nums := []int{20, 10, 30, 30}
result := firstUniqueFreq(nums)
fmt.Println(result)
}

,
# -*-coding:utf-8-*-
def first_unique_freq(nums):
# Count frequency of each number
cnt = {}
for x in nums:
cnt[x] = cnt.get(x, 0) + 1
# Count how many numbers have each frequency
cc = [0] * (len(nums) + 1)
for c in cnt.values():
cc[c] += 1
# Find the first number whose frequency appears only once
for x in nums:
if cc[cnt[x]] == 1:
return x
return-1
def main():
nums = [20, 10, 30, 30]
result = first_unique_freq(nums)
print(result)
if __name__ == "__main__":
main()
,
#include <iostream>
#include <vector>
#include <unordered_map>
int firstUniqueFreq(std::vector<int>& nums) {
std::unordered_map<int, int> cnt;
for (int x : nums) {
cnt[x]++;
}
std::vector<int> cc(nums.size() + 1, 0);
for (const auto& pair : cnt) {
cc[pair.second]++;
}
for (int x : nums) {
if (cc[cnt[x]] == 1) {
return x;
}
}
return-1;
}
int main() {
std::vector<int> nums = {20, 10, 30, 30};
int result = firstUniqueFreq(nums);
std::cout << result << std::endl;
return0;
}