题目
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
题解
1通过排序实现
1.1描述
通过调用排序的方式,获得从小到大的数组,比较相邻的值是否相等,即可得到重复的元素,此时排序的时间复杂度为O(nlogn),空间复杂度为O(1)
1.2code
1 import java.util.*; 2 public class Solution { 3 public boolean duplicate(int numbers[],int length,int [] duplication) { 4 if(numbers == null || length == 0){ 5 return false; 6 } 7 Arrays.sort(numbers); 8 for(int i=0;i<length-1;i++){ 9 if(numbers[i] == numbers[i+1]){ 10 duplication[0] = numbers[i]; 11 return true; 12 } 13 } 14 return false; 15 } 16 }
2通过哈希表实现
2.1描述
扫描数组,判断当前的值是否存在哈希表中,若存在则是重复数字,若不存在就添加,时间复杂度O(n),空间复杂度O(n)
2.2code
1 import java.util.*; 2 public class Solution { 3 public boolean duplicate(int numbers[],int length,int [] duplication) { 4 Set<Integer> set = new HashSet<>(); 5 for(int i =0 ;i<length;i++){ 6 if(set.contains(numbers[i])){ 7 duplication[0] = numbers[i]; 8 return true; 9 }else{ 10 set.add(numbers[i]); 11 } 12 } 13 return false; 14 } 15 }
3通过数组下标实现
3.1描述
扫描数组,判断下标为i的值是否等于i,若不等于i,则判断下标为numbers[i]的值是否等于numbers[numbers[i]],若等于则重复,不等于则交换,时间复杂度O(n),空间复杂度O(1)
3.2code
1 public class Solution { 2 public boolean duplicate(int numbers[],int length,int [] duplication) { 3 if(numbers==null||length==0){ 4 return false; 5 } 6 int num=0;//重复数字的下标 7 //遍历数组 8 for(int i=0;i<numbers.length;i++){ 9 //判断i是否等于numbers[i] 10 while(i!=numbers[i]){//不等于,则判断m=numbers[i]是否等于numbers[m] 11 int m=numbers[i]; 12 if(m==numbers[m]){//如果m下标的值等于i下标的值,就是重复的 13 duplication[0]=m; 14 return true; 15 }else{//如果m下标的值不等于i下标的值,就进行调换,将i下标的值调到m的位置,使得numbers[m]==m 16 numbers[i]=numbers[m]; 17 numbers[m]=m; 18 } 19 } 20 } 21 return false; 22 } 23 }