劍指Offer(面試題3-2)——不修改數組找出重複的數字

劍指 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章