本題與3-1基本相同,不同之處在於數組不能修改,考慮輔助數組可采用3-1解法進行求解,以空間代價進行求解。
1.題目描述
在一個長度為n+1的數組里的所有數字都在1~n的范圍內,所以數組中至少存在一個數字是重復的。請找出數組中任意一個重復的數字,但不能修改輸入的數組。例如輸入長度為8的數組{2,3,5,4,3,2,6,7},那么對應的輸出是重復的數字2或者3。
2.不同解法
考慮類似二分查找進行搜索,對1~n范圍內的數值進行二分,若數組中在所限定范圍內的元素個數大於范圍值,則在此范圍內必然有重復數字。
如{1,2,4,3,3},考慮1~5范圍取一半1~3,統計在此范圍內的元素個數為4,表明1~3內有重復元素,再進行二分。
1 public static int getRepeatNumber(int[] array) { 2 // Judge the boundary of this problem 3 int len = array.length; 4 if (len == 0) {return -1;} 5 int lo = 1; 6 int hi = len - 1; 7 while(lo <= hi) { 8 int mid = (hi + lo) / 2; 9 int count = 0; 10 for (int n: 11 array) { 12 if (n >= lo && n <= mid) { 13 count++; 14 } 15 } 16 if (hi == lo) { 17 if (count > 1) { 18 return hi; 19 } else { 20 break; 21 } 22 } 23 if (count > mid - lo + 1) { 24 hi = mid; 25 } else { 26 lo = mid + 1; 27 } 28 } 29 return -1; 30 }
復雜度分析:時間復雜度O(nlogn),空間復雜度O(1)。