本文详解如何判断整型数组中是否存在至少一个重复元素,重点分析暴力解法的逻辑缺陷、编译错误根源,并提供基于 java stream 的简洁高效解法,兼顾可读性与时间复杂度优化。
本文详解如何判断整型数组中是否存在至少一个重复元素,重点分析暴力解法的逻辑缺陷、编译错误根源,并提供基于 java stream 的简洁高效解法,兼顾可读性与时间复杂度优化。
在 LeetCode 第 217 题“Contains Duplicate”中,核心要求是:给定一个整数数组 nums,若任意元素出现次数 ≥ 2,返回 true;若所有元素互异,返回 false。看似简单,但初学者常因方法签名不匹配、逻辑漏洞或性能误区而失败。
首先,你提供的代码报错:
Line 7: error: method containsDuplicate in class Solution cannot be applied to given types;
boolean ret = new Solution().containsDuplicate(param_1);
^
required: int[], int
found: int[]
根本原因是 LeetCode 的自动测试驱动类(__Driver__.java)调用的是 无参版本 containsDuplicate(int[]),而你的方法定义为 containsDuplicate(int[], int) —— 多了一个 len 参数。LeetCode 标准接口严格匹配方法签名,因此必须删除 len 参数,并通过 nums.length 获取长度。
更关键的是,原双重循环逻辑存在严重错误:
for(int i=0; i<len i for j="0;" if nums true return><p>该写法未排除自比较(i == j),导致任何非空数组都返回 true,完全违背题意。</p>
<p>✅ 正确的暴力解法应跳过自身索引:</p>
<pre class="brush:php;toolbar:false;">public static boolean containsDuplicate(int[] nums) {
for (int i = 0; i <p>但该解法时间复杂度为 O(n²),仅适用于小规模数据。</p><p>? <strong>推荐解法:利用 Set 去重特性(最优实践)</strong><br>
借助 HashSet 的 add() 方法——它返回 false 当且仅当元素已存在:</p><pre class="brush:php;toolbar:false;">import java.util.HashSet;
import java.util.Set;
public static boolean containsDuplicate(int[] nums) {
Set<integer> seen = new HashSet();
for (int num : nums) {
if (!seen.add(num)) { // add() 返回 false 表示已存在
return true;
}
}
return false;
}</integer>
✅ 时间复杂度:O(n),空间复杂度:O(n);✅ 逻辑清晰,无边界错误;✅ 兼容 LeetCode 标准调用。
⚠️ 注意事项:
- 不要手动传入数组长度,Java 数组自带 .length 属性;
- 避免使用 Arrays.stream(nums).distinct().count() != nums.length,虽语义直观,但 distinct() 在底层仍需哈希表,且流式操作有额外开销,不如显式 HashSet 高效可控;
- 若需极致空间优化(如内存受限),可先排序再线性扫描(O(n log n) 时间,O(1) 额外空间),但需注意修改原数组是否被允许。
总结:解决此类问题,应优先选择哈希集合一次遍历方案——它平衡了效率、可读性与健壮性,也是工业级代码中的标准范式。










