版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86373078
day17, 重复 N 次的元素
题目来源:leetcode
在大小为 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
解答:这道题很简单很简单。最直观的方法就是开辟一个数组用来记录重复元素的个数,这种方法时间复杂度为O(n), 运行时间为线性。
这里主要介绍一个线性时间的原地算法。
我们可以采用计数器的思想,但是这里由于重复元素的重复次数为N,所以我们应该去除一个非重复元素。如何去除非重复元素?可以先找到最大值与最小值,从二者中选择一个非重复元素。再使用计数器的思想。over.
代码:
class Solution {
public:
int repeatedNTimes(vector<int>& A) {
int max = A[0], min = A[0];
for( int i = 1; i < A.size(); i++){
if( A[i] > max)
max = A[i];
else if( A[i] < min)
min = A[i];
}
int flag = 1;
//cout<<max<<' '<<min<<endl;
for( int i = 0; i < A.size(); i++)
if( A[i] == max && flag == 1)
flag--;
else if( A[i] == max && flag == 0){
flag--;
break;
}
if( flag < 0)
max = min;//此时max可能是min也可能是max
int number = A[0], count = 1, k = 0;
while(number == max && k < A.size())
number = A[++k];
//cout<<max<<' '<<number<<' '<<k<<endl;
for( int i = 0; i < A.size(); i++){
if( k == i || A[i] == max)
continue;
if( count == 0){
cout<<i<<' ';
number = A[i];
count++;
continue;
}
if( A[i] != number)
count--;
else
count++;
}
return number;
}
};
运行结果: