📅  最后修改于: 2023-12-03 15:23:31.654000             🧑  作者: Mango
在程序开发中,我们经常需要查找一个只读数组中是否包含任何一个重复的元素。为了实现这个目标,我们可以使用以下的算法:
public static boolean containsDuplicates(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) {
return true;
}
set.add(nums[i]);
}
return false;
}
这个算法的基本思想是使用一个set集合储存数组中的每个元素,如果在添加元素时发现set集合中已经包含了该元素,那么就说明数组中存在重复元素,返回true;否则将该元素添加到set集合中,继续扫描下一个元素。
这个算法的时间复杂度是O(n),空间复杂度也是O(n)。
实际上,我们并不需要找出数组中每个重复的元素,只需要找出任何一个重复元素就可以了。所以,我们可以在遍历数组时,直接返回第一个重复的元素即可:
public static int findDuplicate(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) {
return nums[i];
}
set.add(nums[i]);
}
throw new IllegalArgumentException("No duplicates found in array.");
}
这个算法和前面的算法基本一致,只不过在遇到第一个重复元素时就直接返回。如果没有重复元素,则会抛出一个异常。
这个算法的时间复杂度还是O(n),空间复杂度也是O(n)。