数组中的第一个重复元素 (C++)
发布: (2026年1月14日 GMT+8 01:06)
3 min read
原文: Dev.to
Source: Dev.to
为什么我的第一种方法是错的 — 以及我是如何修正的
问题澄清(非常重要)
任务是找出 在所有重复元素中首次出现索引最小的那个元素。
它 不是:
- 最小的数值
- 任意一个重复元素
顺序很重要。
初始暴力解法(错误逻辑)
vector v = {1, 2, 3, 4, 1, 2};
int t = INT_MAX;
for (int i = 0; i = j) {
t = v[j]; // ❌ 错误的比较和赋值
}
cout = j 把值和索引混在一起,导致结果错误。
修正后的暴力解法(基于索引的思考)
重新思考问题后,目标是记录 重复元素的最小索引,而不是元素本身的值。
vector v = {1, 2, 3, 4, 1, 2};
int t = INT_MAX;
for (int i = 0; i i) {
t = i; // ✅ 存储首次出现的索引
}
vector v = {4, 5, 6, 7, 5, 4, 7};
vector freq(100, 0);
int t = INT_MAX;
for (int x : v) {
if (freq[x] > 0) {
t = x;
break;
}
freq[x]++;
}
cout << t;
复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(k),其中 k 为可能取值的范围(这里是 100)。
亲自尝试(使用 unordered_map)
在查看任何解答之前,尝试使用 std::unordered_map 来记录首次出现的位置。
关键学习(最重要)
错误并不是语法错误——而是对题目描述的误解。
- 始终明确任务中 “first” 的含义。
- 对于涉及顺序的问题,基于索引的思考至关重要。
最后感悟
最初的解法虽然错误,却帮助我们认识到正确解读需求的重要性。纠正自己的逻辑是提升问题解决能力的最有力方式。