1.改變數組
public static int getRepeat(int[] arr){ for (int i = 0; i < arr.length; i++) { while (arr[i] != i){ if (arr[i] == arr[arr[i]]){ return arr[i]; }else { int tmp = arr[i]; arr[i] = arr[tmp]; arr[tmp] = tmp; } } } return -1; }
2.不改變數組,使用輔助數組
public static int getRepeat(int[] arr){ int[] arrtmp = Arrays.copyOf(arr,arr.length ); for (int i = 0; i < arrtmp.length; i++) { while (arrtmp[i] == i){ if (arrtmp[i] == arrtmp[arrtmp[i]]){ return arrtmp[i]; }else { int tmp = arrtmp[i]; arrtmp[i] = arrtmp[tmp]; arrtmp[tmp] = tmp; } } } return -1; }
3.不改變數組,二分查找
public static int getDuplication(int[] arr){ int start = 1; int end = arr.length-1; while (end >= start){ int mid = ((end - start)>>1) +start; int count = getCount(arr,start ,mid ); //得到結果的條件 if (end == start) { if (count > 1) { return start; } else { break; } } if (count > (mid-start +1)){ end = mid ; }else { start = mid + 1; } } return -1; } private static int getCount(int[] arr, int start, int end) { int count = 0; for (int i = 0; i < arr.length; i++) { if (arr[i] <= end && arr[i]>= start ) count++; } return count; }