1.算法题目
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
示例 1:
输入: [1,2,3,1]
输出: true
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
2.算法思路
算法思路:
- 暴力法:冒泡法思想,逐一检查每个元素在数组中是否存在重复元素,遇到重复元素则返回 true,否则继续遍历,算法复杂度较高O(n^2);
- 排序查找算法:考虑到有序数组查找重复元素只需要遍历一次,所以可以通过高效的排序算法将数组元素排序,然后遍历一遍数组即可确定数组是否存在重复元素,算法复杂度是 O(nlogn + n),即 O(nlogn);
- 哈希表:
3.算法代码
算法代码:
- 根据算法思路1编写的代码比较简单,但在leecode上面提交代码会提示超时,而且代码实现逻辑比较简单就不提供了;
- 借助排序算法编写的算法代码如下:
public static boolean containsDuplicate(int[] nums) {
Arrays.sort(nums); // 对数组排序
for (int i = 0; i < nums.length - 1; i ++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
- 根据哈希表思路编写的算法代码如下:
Set<Integer> set = new HashSet<>(nums.length);
for (int i = 0; i < nums.length; i ++) {
if (set.contains(nums[i])) {
return true;
}
set.add(nums[i]);
}
return false;
4.总结
对于一些特定的 n 不太大的测试样例,哈希表实现方法的运行速度可能会比排序查找算法更慢。这是因为哈希表在维护其属性时有一些开销。要注意,程序的实际运行表现和 Big-O 符号表示可能有所不同。Big-O 只是告诉我们在 充分 大的输入下,算法的相对快慢。因此,在 n 不够大的情况下, O(n) 的算法也可以比 O(nlogn) 的更慢。
如果你有疑问或更好的算法思路,欢迎留言交流!!!