题目描述
在大小为2N的数组A中有N+1个不同的元素,其中一个元素重复了N次。返回重复了N次的那个元素。
示例1
输入:[1,2,3,3]
输出:3
示例2
输入:[2,1,2,5,3,2]
输出:2
示例3
输入:[5,1,5,2,5,3,5,4]
输出:5
解题思路
本题最容易想到是对原始序列进行排序,然后通过判断中间位置元素是否与最后一个元素相等判断重复出现N次的元素。时间复杂度是O(nlogn)。虽然本题可以通过,但是在面试中很有可能被问到能否在O(N)时间复杂度内完成。考虑数字的排序情况,例如示例3:可以看成先放好 1,2,3,4 ,然后相当于在5个空格中插入4个5,所有可能出现的情况可以分为三类:出现两个5相邻;没有相邻的情况,但是第一个位置和第三个位置元素相等,或第一个位置和最后位置相等;重复的元素全部出现在偶数位置上。
O(NlogN):
int repeatedNTimes(vector<int>& A) {
sort(A.begin(),A.end());
return A[A.size()/2]==A[A.size()-1]?A[A.size()/2]:A[A.size()/2-1];
}
O(N):
int repeatedNTimes(vector<int>& A) {
int i,len = A.size();
for(i=0;i<len - 1;i++){
if(A[i] == A[i+1]) return A[i];
}
if(A[0] == A[2] || A[0] == A[A.size()-1]) return A[0];
return A[1];
}