多种解法全解析——力扣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)
,没有额外开销。
代码实现
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)
。
代码实现
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)
,哈希集合的存储开销。
代码实现
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)
代码实现
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)
代码实现
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) | 简洁优雅,但开销稍大 |
其中 哈希集合解法 是最常用、最推荐的方案。