【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),最坏情况下(数组中无重复元素),需要将所有元素存入哈希容器中。
相关推荐
FlightYe9 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
ZhengEnCi9 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考9 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
by2099910 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble10 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长11 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall11 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊11 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
夜不会漫长11 小时前
C++:红黑树
数据结构·算法
文丑颜不良啊12 小时前
LeetCode1661~1680题目解析
java·leetcode