多种解法全解析——力扣217. 存在重复元素

力扣217. 存在重复元素


【LeetCode题解】217. 存在重复元素(多种解法全解析)

一、题目描述

给定一个整数数组 nums,判断数组中是否存在重复元素:

  • 如果任一值在数组中至少出现两次,返回 true
  • 如果数组中每个元素都不同,返回 false

示例

示例 1:

复制代码
输入: nums = [1,2,3,1]
输出: true

示例 2:

复制代码
输入: nums = [1,2,3,4]
输出: false

示例 3:

复制代码
输入: nums = [1,1,1,3,3,4,3,2,4,2]
输出: true

提示

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

二、解法思路

这道题的核心就是:检查数组中是否有重复元素

下面我会从暴力法到高效解法,依次介绍多种方法。


三、解法一:暴力枚举(双重循环)

这是最直观的解法,对每个元素都去和后续所有元素比较,如果有相等的就返回 true

  • 时间复杂度:O(n^2),最坏情况下要比较所有元素对。
  • 空间复杂度:O(1),没有额外开销。

代码实现

java 复制代码
class Solution {
    public boolean containsDuplicate(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] == nums[j]) {
                    return true;
                }
            }
        }
        return false;
    }
}

四、解法二:排序后扫描

先对数组排序,重复元素一定会出现在相邻位置。只要检查相邻是否相等即可。

  • 时间复杂度:O(n log n),排序的时间消耗。
  • 空间复杂度:取决于排序算法,通常是 O(1)O(log n)

代码实现

java 复制代码
import java.util.Arrays;

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Arrays.sort(nums);
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == nums[i - 1]) {
                return true;
            }
        }
        return false;
    }
}

五、解法三:哈希集合(HashSet)

利用哈希集合的特性:

  • 插入时如果发现元素已经存在,则说明有重复。

这是最常用的方法,效率也最高。

  • 时间复杂度:O(n),遍历一次数组。
  • 空间复杂度:O(n),哈希集合的存储开销。

代码实现

java 复制代码
import java.util.HashSet;

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashSet<Integer> seen = new HashSet<>();
        for (int num : nums) {
            if (seen.contains(num)) {
                return true;
            }
            seen.add(num);
        }
        return false;
    }
}

六、解法四:哈希表(HashMap)

与 HashSet 类似,用哈希表统计每个元素的出现次数,如果某个元素超过 1,则返回 true

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

代码实现

java 复制代码
import java.util.HashMap;

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            if (map.containsKey(num)) {
                return true;
            }
            map.put(num, 1);
        }
        return false;
    }
}

七、解法五:流式写法(Java 8+)

如果使用 Java 8 及以上版本,可以利用流的去重特性。

通过比较去重前后的长度是否相等,判断是否有重复元素。

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

代码实现

java 复制代码
import java.util.Arrays;

class Solution {
    public boolean containsDuplicate(int[] nums) {
        return Arrays.stream(nums).distinct().count() < nums.length;
    }
}

八、总结

方法 时间复杂度 空间复杂度 适用场景
暴力枚举 O(n^2) O(1) 数据规模很小
排序后扫描 O(n log n) O(1)~O(log n) 中等规模,允许排序
哈希集合 O(n) O(n) 高效通用,推荐
哈希表计数 O(n) O(n) 适合需要统计频率
流式写法 O(n) O(n) 简洁优雅,但开销稍大

其中 哈希集合解法 是最常用、最推荐的方案。


相关推荐
政企项目老覃2 小时前
大模型幻觉治理与自动评测:金融风控场景的落地实践
人工智能·算法·机器学习
淡海水3 小时前
08-03-不可变-ImmutableDictionary-TKey-TValue-与ImmutableHashSet-T-持久化哈希树
数据结构·算法·c#·哈希算法·dictionary·immutable
hansang_IR3 小时前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论
洛阳纸贵3 小时前
MATLAB-matlab基础知识
学习·算法·matlab
落羽的落羽3 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
Nil2084 小时前
leetcode 17电话号码的字母组合
算法·leetcode·职场和发展
203号居民5 小时前
LeetCode hot 100 — 25. K 个一组翻转链表
算法·leetcode·链表
ocean21036 小时前
2025-2026年AI算法与模型研发面试高频知识点洞察
人工智能·算法·面试
Nil2086 小时前
leetcode 78子集
数据结构·算法·leetcode