哈希表(存在重复元素)(3)

一.题目

217. 存在重复元素 - 力扣(LeetCode)

二.思路讲解

2.1 思路讲解

看到题目要求找出数组中至少出现两次的元素,我们可能会想到用位运算异或 来找出出现奇数次的数,但这里需要的是至少两次 ,即重复出现的数,且可能有多个重复值,异或就不适用了。因此,我们需要用哈希表 来统计每个元素出现的次数。为什么推荐用哈希表而不是数组呢?因为数组元素的值可能是负数 ,如果用数组模拟哈希表,需要将负数映射到非负下标,这往往需要偏移处理,且可能造成空间浪费;而哈希表可以直接以元素值为键,无论正负都能高效存储和查找,实现简单。

三.代码演示

cpp 复制代码
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) 
    {
        unordered_map<int,int>hash;//前者为元素的值,后者为元素出现的次数
        int n = nums.size();
        for(const auto& x : nums)
        {
            hash[x]++;//进元素
            if(hash[x] > 1)//判断元素是否出现
                return true;
        }    
        return false;
    }
};

四.代码讲解

一、初始化哈希表

为了快速判断数组中是否有重复元素,我们需要记录每个元素出现的次数。这里选择 unordered_map<int, int> 作为哈希表,其中键为数组元素的值,值为该元素当前出现的次数。使用哈希表的原因是数组元素可能为负数或较大整数,无法直接用数组下标映射,而哈希表可以直接以元素值为键,灵活且高效。

二、遍历数组并统计

使用范围 for 循环遍历数组 nums 中的每一个元素 x。对于每个元素,执行以下操作:

  • hash[x] 的值加 1,表示该元素出现了一次。

  • 在每次增加后,立即检查当前元素的出现次数是否大于 1,即 if (hash[x] > 1)。如果大于 1,说明该元素已经出现过至少两次,即找到了重复元素。

三、判断重复并返回

一旦发现某个元素的次数大于 1,立即返回 true,表示数组包含重复元素。如果遍历完整个数组都没有返回,则说明所有元素都只出现一次,最后返回 false

四、关键细节
  • 哈希表的选择unordered_map 基于哈希表实现,插入和查找的平均时间复杂度为 O(1)

  • 边统计边判断:在每次增加计数后立即检查,可以提前结束循环,避免不必要的遍历。

  • 空间复杂度 :最坏情况下,所有元素都不重复,哈希表需要存储 n 个元素,空间复杂度为 O(n)

相关推荐
其美杰布-富贵-李29 分钟前
08 进阶评估指标与算法特定指标
人工智能·算法
我的xiaodoujiao38 分钟前
快速学习Python基础知识详细图文教程17--类型注解和断点调试
开发语言·python·学习·测试工具
.道阻且长.1 小时前
5.LeetCode算法习题讲解--双指针--有效三角形的个数
算法·leetcode·职场和发展
我是海飞1 小时前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理
wabs6662 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
IT古董3 小时前
【MES学习笔记系列】MES 厂商与产品对比
笔记·学习
wuyk5553 小时前
2.队列:先进先出的线性数据结构
c语言·数据结构·stm32·单片机
会周易的程序员3 小时前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图
wangyue_msn_863 小时前
Agent知识学习笔记——03 RAG
笔记·学习·ai编程
呱呱巨基3 小时前
Linux 查找命令
linux·笔记·学习·查找命令