该题代码核心由HashSet的add()方法实现
* HashSetd 的代码在最下边,心急的朋友可直接跳过无关紧要的算法1 *
算法1
(暴力遍历)
先对数组进行一次遍历,判断数组内元素的值是否均满足1 ~ n这个条件
然后使用双层循环寻找相同元素,即判断内层循环的数组元素值是否与外层循环的元素值相等
若相等,就return该元素值,;在外层循环语句的后边return -1, 当双层循环执行结束,仍未找到相同元素时,
系统将执行return -1这个语句。
该题解未附算法1的代码,因为我主要是拿它来跟算法2做对比
时间复杂度
光是看到双层循环就知道这个算法效率不够高,
----------说了那么多废话,下面重点就要来了!
算法2
(巧用HashSet)
HashSet是Java自带的一个类,它的一个特点是放入该类生成的实例化对象内的元素不能重复
因此,利用此特点稍加变化即在一次遍历数组后解决该题目。
代码
class Solution {
public int duplicateInArray(int[] nums) {
HashSet[HTML_REMOVED] hSet = new HashSet<>();
for (int i : nums)
if (i >= 1 && i < nums.length)
if (!hSet.add(i))
return i;
return -1;
}
}
时间复杂度
平均时间复杂度为:O((n+1)/2)
** 本人是初学Java的在校生,好不容易遇见个自己会改善算法的题目,于是写下了这篇题解,
如有错误,还望各位指正。多谢支持**
空间复杂度是O(1)呀?不能用HashSet
如果一个数组的值为{1,1,0,2,3} ,这个代码的处理就出错了,会返回1,而不是返回正确答案-1;
题目要求,数组中所有的数均在1~n的范围内,其中n≥1。所以你这个例子是不符合题意的
🙇🙇🙇🙇🙇🙇我审题不仔细