题目
在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。
题解
这里用letcode287号题的解题思路,没有用书上的解题思路,具体思路是迭代数组并将每个元素插入 seen 中。在插入之前,我们检查它是否已经存在。如果是,那么我们找到了我们的副本,然后打印它。
复杂度分析
时间复杂度:O(n)。Java 依赖于底层的哈希表,所以插入和查找有固定的时间复杂度。
空间复杂度:O(n),在最坏的情况下,重复元素出现两次,其中一次出现在数组索引 n-1n−1 处。在这种情况下,seen 将包含 n-1n−1 不同的值,因此将占用 O(n) 空间。
代码实现
package Offer;
import java.util.HashSet;
import java.util.Set;
public class FindDuplication03 {
public static void duplicate(int numbers[]) {
Set<Integer> seen = new HashSet<Integer>();
int i = 0;
if(numbers.length == 0) {
System.out.println("数组为空!");
}else {
for(int num:numbers) {
if(seen.contains(num)) {
System.out.println(num);
i++;
}
seen.add(num);
}
if(i == 0) {
System.out.println("没有相同的数字!");
}
}
}
public static void main(String[] args) {
//没有重复数字
int[] nums1 = new int[]{0,2,3,4,5,6,1,8};
duplicate(nums1);
System.out.println("-----------------");
//多个重复数字
int[] nums2 = new int[]{9,2,3,4,5,9,7,1,8,8};
duplicate(nums2)
System.out.println("-----------------");
//数组为空
int[] nums3 = new int[]{};
duplicate(nums3);
}
}
输出结果
tips:
考虑到了书中的测试用例提到的要求,但是没有考虑其它的特殊情况,如有问题欢迎大家指正。