数组中的第一个重复元素 (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” 的含义。
  • 对于涉及顺序的问题,基于索引的思考至关重要。

最后感悟

最初的解法虽然错误,却帮助我们认识到正确解读需求的重要性。纠正自己的逻辑是提升问题解决能力的最有力方式。

Back to Blog

相关文章

阅读更多 »

C++ 中的第 K 大元素

🧩 问题描述:给定一个数组和一个整数 k,找出第 k 大的元素。示例 - 输入:3, 2, 1, 5, 6, 4,k = 2 - 输出:5 🧠 我的第一想法:...