![dc44ef2286da11e52e68dcf0f66385ee.png](https://i-blog.csdnimg.cn/blog_migrate/ae8e9651be68c019613442ee30156780.jpeg)
961.重复 N 次的元素
Loading...leetcode.com![06eb75e605b153642cba796eb14e0622.png](https://i-blog.csdnimg.cn/blog_migrate/5152d2fc4d906fcdcabc7c13ecf67ef1.jpeg)
在大小为 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
提示:
4 <= A.length <= 10000
0 <= A[i] < 10000
A.length 为偶数
第一种解法,因为数据集中在 0 ~ 10000 的范围,所以可以用「桶排序」思想解题。建立一个长度 10000 的数组,数据全部初始化为 0。每当有数据落入桶中则让数据 +1。当所有数据落入桶中后。检查是哪个数据等于 N ,同时输出该数据索引。
时间复杂度为 O(n),但是当数据量小是过于浪费空间复杂度。参考 LeetCode 的英文社区 看到了 @zhaoyaoqiong 答案
int repeatedNTimes(int* A, int ASize) {
int tempNums[10000] = { 0 },i=0;
for (; i < ASize; i++)
tempNums[*(A + i)]++;
for (i = 0; i < 10000; i++)
if (tempNums[i] == ASize / 2)
break;
return i;
}
解法二,先分析清楚题目,在 2N+1 长度的数组中有 N+1 个元素,某个元素有 N 个重复,所以当某个元素重复 2 次即该元素就是我们题中要找的元素。且该元素彼此间隔的最小长度不超过 2(),而最优情况为间隔为 1(稍微理清下思路应该能理解)。
节省了空间复杂度,同时时间复杂度为 O(n)
int repeatedNTimes(int* A, int ASize) {
int i;
for (i = 0; i < ASize - 1; i++)
if (A[i] == A[i + 1] || A[i] == A[i + 2]||A[i]==A[i+3])
break;
return A[i];
}