【每日刷题】重复 N 次的元素

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
};

运行结果:image.png-27.8kB


我的微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/86373078
今日推荐