面試題3-2:不修改數組找出重復的數字


本題與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)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM