在长度 2N 的数组中找出重复 N 次的元素

题目描述

给你一个整数数组 nums ,该数组具有以下属性:
nums.length == 2 * n.
nums 包含 n + 1 个 不同的元素
nums 中恰有一个元素重复 n 次
要求找出并返回重复了 n 次的那个元素。

解法一

思路:用map来记录数据,构造键值对,first的值为nums里面的值,second用来记录每一个nums中的值出现的次数,遍历整个nums,记录下每一个数据。接着再次遍历构造的map,判断map中的数据的second值是否为n,如果为n,那证明该数字是重复了n次的数据。

核心代码如下:

    int repeatedNTimes(vector<int>& nums) 
    {
        map<int,int> m;
        for(const auto &e : nums)
            m[e]++;

        int res;
        for(const auto &e : m)
        {
            if(e.second == nums.size()/2)
            {
                res = e.first;
                break;
            }
        }
        return res;
    }

上述解法的map换成unordered_map也完全可以。

解法二

思路:对nums进行遍历,用哈希表来存储已经出现过的元素,如果再次遍历到哈希表中已经存在的元素,那该元素则是出现了n次的元素。

核心代码如下:

    int repeatedNTimes(vector<int>& nums) 
    {
        unordered_set<int> s;
        for(const auto &e : nums)
        {
            if(s.count(e)==1)
            {
                return e;
            }
            s.insert(e);
        }
        return -1;
    }

unordered_set换成set也可以实现。

解法三

思路:我们设重复n次的元素为x,nums数据一共有2*n个,x就有n个,可以说占的比重是相当大的,所以不难想到,x在nums中的排列是相对密集的,从出现的位置的角度考虑,有以下做法:如果相邻的x之间至少间隔了2个位置,那么数组的总长度至少为:n+2(n-1)=3n-2;当n>2时,3n-2>2n,不存在满足要求的数组,因此一定存在两个相邻的x,它们的位置连续或者只间隔了一个位置,当n=2时,数组的长度最多为2n=4,因此最多只能间隔两个位置。

核心代码如下:

    int repeatedNTimes(vector<int>& nums) 
    {
        int n = nums.size();
        for(int i = 0;i < n; ++i)
        {
            int temp = nums[i];
            if(i-1>=0 && nums[i-1]==temp) return temp;
            if(i-2>=0 && nums[i-2]==temp) return temp;
            if(i-3>=0 && nums[i-3]==temp) return temp;
        }
        return -1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值