【C++算法打怪专栏】LeetCode 217. 存在重复元素(解法总结)

【C++算法打怪专栏】LeetCode 217. 存在重复元素(解法总结)

一、 题目链接


二、 核心思路对比

判断数组中是否存在重复元素,最经典且高效的方案是利用哈希表结构。通常有两种主流写法:

  1. 方法一:哈希集合 unordered_set(最优解)

    • 核心思想 :因为我们只关心"某个元素有没有出现过",不需要记录具体的次数或下标,所以使用 unordered_set 最为合适。
    • 执行流程 :遍历数组,检查当前元素是否已经在 set 中:
      • 如果已存在,说明重复,直接返回 true。
      • 如果不存在,将其插入 set 中。
      • 遍历结束若无重复,返回 false。
  2. 方法二:哈希映射 unordered_map(计数法)

    • 核心思想 :利用 unordered_map 记录每个元素出现的频次。
    • 执行流程 :遍历数组,将当前元素的计数加 1(mp[nums[i]]++),随后检查其频次是否大于 1:
      • 如果大于 1,说明重复,直接返回 true。
      • 遍历结束若频次均不大于 1,返回 false。

三、 C++ 标准精简源码

方法一:unordered_set(推荐)

cpp 复制代码
#include <vector>
#include <unordered_set>
using namespace std;

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> un; // 只需一个模板参数
        
        for (int i : nums) {
            // 如果在集合中找到了当前元素,说明重复
            if (un.find(i) != un.end()) {
                return true;
            }
            un.insert(i);
        }
        
        return false;
    }
};

方法二:unordered_map

cpp 复制代码
#include <vector>
#include <unordered_map>
using namespace std;

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_map<int, int> mp; // 键:数值,值:出现次数
        
        for (int i = 0; i < nums.size(); i++) {
            mp[nums[i]]++;
            // 如果当前数字出现次数超过 1 次,说明重复
            if (mp[nums[i]] > 1) {
                return true;
            }
        }
        
        return false;
    }
};

四、 复杂度分析

  • 时间复杂度 : O ( N ) O(N) O(N),其中 N N N 是数组的长度。我们对数组进行了一次单循环,哈希容器的查找、插入及更新操作平均时间复杂度均为 O ( 1 ) O(1) O(1)。
  • 空间复杂度 : O ( N ) O(N) O(N),最坏情况下(数组中无重复元素),需要将所有元素存入哈希容器中。
相关推荐
Tisfy41 分钟前
LeetCode 2333.最小差值平方和:排序 + 数学计算(不用二分)
数学·算法·leetcode·题解·贪心·排序
lojox1 小时前
深入理解 C++ STL:vector 底层实现、迭代器失效与 list 特性
开发语言·c++
微笑星河q2 小时前
C++类和对象(下)初始化列表、类型转换、static、友元、内部类、匿名对象
开发语言·c++
yi0112 小时前
DAY28: LeetCode 111. 二叉树的最小深度
人工智能·笔记·python·算法·leetcode·二叉树·递归
|_⊙2 小时前
C++ 类和对象零散知识点
开发语言·c++
wuyk5552 小时前
27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战
stm32·单片机·嵌入式硬件·算法
xiangyun612 小时前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
xxwl5853 小时前
三、区域赛算法模版第三章---字符串相关算法
笔记·学习·算法
信奥卷王3 小时前
[GESP202509 六级] 划分字符串(含视频)
数据结构·算法