题目
在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},那么对应的输出是重复的数字2或者3。
思路
方式1 使用哈希表
public static boolean duplicate2(int numbers[], int length, int[] duplication) {
//判断数组是否非法
if (numbers.length <= 0 || numbers == null) {
return false;
}
//判断数组值是否符合和要求
for (int number : numbers) {
if (number <=0||number>=numbers.length) {
return false;
}
}
HashSet<Integer> set = new HashSet<>();
for (int number : numbers) {
boolean add = set.add(number);
if (!add) {
duplication[0] = number;
return true;
}
}
return false;
}
时间复杂度o(n),空间复杂度O(n)
方式2 将数组看成链表,数组的下标对应于链表节点中的值,数组中每一项的值对应于节点的指针,使用龟兔赛跑算法
public int findDuplicate(int[] nums) {
int slow=0;
int fast=0;
//寻找相遇点
do{
slow=nums[slow];
fast=nums[nums[fast]];
}while (slow!=fast);
slow=0;
while (slow!=fast){
slow=nums[slow];
fast=nums[fast];
}
return slow;
}
时间复杂度o(n),空间复杂度O(1)