多种解法全解析——力扣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) 简洁优雅,但开销稍大

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


相关推荐
Jiezcode3 小时前
LeetCode 199.二叉树的右视图
c++·算法·leetcode·深度优先
10001hours3 小时前
C语言第23讲
c语言·开发语言·算法
MoRanzhi12033 小时前
基于 SciPy 的矩阵运算与线性代数应用详解
人工智能·python·线性代数·算法·数学建模·矩阵·scipy
仰泳的熊猫3 小时前
LeetCode:239. 滑动窗口最大值
数据结构·c++·算法·leetcode
CoovallyAIHub3 小时前
版本号突袭!官方预览:YOLO26正式宣布,10月发布,CPU推理速度提升43%
深度学习·算法·计算机视觉
Ms.lan4 小时前
C++数组
数据结构·c++·算法·visual studio
~~李木子~~4 小时前
归并排序算法
数据结构·算法·排序算法
做运维的阿瑞8 小时前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
weixin_3077791310 小时前
Redshift SQL搜索表中所有字段的值
数据仓库·sql·算法·云计算·aws