package 剑指Offer.数组中重复的数字;
import java.util.HashSet;
import java.util.Set;
/**
* @program:多线程和IO
* @descripton:
* @author:ZhengCheng
* @create:2021/9/17-19:00
**/
public class FindRepeatNum {
public static void main(String[] args) {
int[] a = new int[1000001];
for (int i = 0; i < 1000000; i++) {
a[i] = i;
}
a[1000000] = 999999;
long l1 = System.currentTimeMillis();
new FindRepeatNum().methodSet(a);
long l2 = System.currentTimeMillis();
new FindRepeatNum().methodArr(a);
long l3 = System.currentTimeMillis();
System.out.println(l2-l1);
System.out.println(l3-l2);
}
//使用集合的方式
private int methodSet(int[] arr){
Set<Integer> set = new HashSet<>();
for (int i = 0; i < arr.length; i++) {
if (!set.add(arr[i])){
return arr[i];
}
}
return -1;
}
//由于上述方法使用了一个Set,导致空间复杂度提升,使用arr原位
private int methodArr(int[] arr){
for (int i = 0; i < arr.length; i++) {
if (arr[i] == i){
continue;
}else if (arr[arr[i]] != arr[i]){
int temp = arr[i];
arr[i] = arr[temp];
arr[temp] = temp;
}else {
return arr[i];
}
}
return -1;
}
}
剑指offer-数组中重复的数字(哈希表,原地交换)
本文介绍了一种在整数数组中查找重复数字的方法,通过两种不同的算法实现:一种利用HashSet来快速查找重复项,另一种则是在原数组上进行操作以减少额外的空间复杂度。

被折叠的 条评论
为什么被折叠?



