劍指 Offer——面試題 3-2
題目
不修改數組找出重複的數字
在一個長度位n + 1
的數組裏的所有數字都在1 ~ n
的範圍內,所以數組中至少有一個數字是重複的,請找出數組中任意一個重複的數字,但不能修改輸入的數組
輸入樣例
[2, 3, 5, 4, 3, 2, 6, 7]
輸出樣例
2 或 3
思路
這道題比較特殊的點就是不允許改變輸入數組,如果不改變輸入數組的話,我們就不能對數組進行排序,也不能交換數組元素,所以面試題 3- 2中的方法就不能用了
那我們如何找到數組中的重複元素呢?可以考慮二分的思想
因爲數組是從1 ~ n
的長度爲n + 1
的數組,所以數組中一定存在重複元素,我們先取數組的值的中點mind = 1 + n >> 1
,隨後我們統計數組中<= mid
的元素個數,如果數量大於mid - l(左邊界)
,說明重複元素在左邊,否則說明重複元素在右邊,不斷的二分,我們最後就會找到這個重複出現的元素!代碼如下:
代碼
public:
int duplicateInArray(vector<int>& nums) {
int l = 1, r = nums.size() - 1;
while (l < r) {
int mid = l + r >> 1;
int s = 0;
for (auto num : nums) {
if (num <= mid && num >= l) ++s;
}
if (s > (mid - l + 1)) r = mid;
else l = mid + 1;
}
return l;
}
};