先来看一下原题:
在大小为 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
需要注意的是:
1.4 <= A.length <= 10000
2.0 <= A[i] < 10000
3.A.length
为偶数
首先很容易想到的是可以对整个数组进行排序,因为只有一个元素重复,则输出相邻相同的两个元素就是我们需要的元素。
当然这里还是有更为简单的方法,我们重新读题以后我们会发现还是有一个条件没有使用上:其中有一个元素重复了 N 次。
我们使用示例二:
2,2,1,5,3,2 第一个2和第二个2间隔0个元素
2,1,2,5,3,2 第一个2和第二个2间隔1个元素
2,1,5,2,3,2 第一个2和第二个2间隔2个元素
2,1,5,3,2,2 第一个2和第二个2间隔3个元素
由此我们不难发现一个规律,如果我们不对数组进行排序,直接进行遍历数组,至少会有一对
之间相隔0个或者1个元素,代码如下:
int repeatedNTimes(int* A, int ASize)
{
int i=0;
if(ASize<=0)
{
return 0;
}
for(;i<ASize;i++)
{
if(A[i]-A[i+2]==0||A[i]-A[i+3]==0||A[i]-A[i+1]==0)
{
break;
}
}
return A[i];
}