题目描述
给你一个整数数组 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;
}