題目
在一個長度為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 }