LeetCode961 重复 N 次的元素
Posted youdias
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode961 重复 N 次的元素相关的知识,希望对你有一定的参考价值。
问题: 重复 N 次的元素
在大小为 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
为偶数
链接:https://leetcode-cn.com/contest/weekly-contest-116/problems/n-repeated-element-in-size-2n-array/
分析:
0.AC做法,将数据排序,统计每个元素的个数,一旦某一个是N,返回这个数字。
1.2N个元素中有N+1个不同的元素,且一个元素重复了N次,则这个重复了N次的必定是唯一众数,且除非是最大值或者最小值,否则也必定是中数。
比赛期间尝试直接返回中位值,不过失败了,没继续深入,现在想来,只有是最大值或者最小值的时候才会失败,完全可以只统计最大值个数,最小值个数,如果有一个是N,返回,否则返回排序后中间的那个数字。
AC Code:
1 class Solution { 2 public: 3 int repeatedNTimes(vector<int>& A) { 4 if (A.size() == 2) 5 { 6 return A[0]; 7 } 8 int ret = 0; 9 sort(A.begin(), A.end()); 10 //ret = A[A.size() / 2]; 11 int num = 1; 12 ret = A[0]; 13 for (unsigned int i = 1; i < A.size(); i++) 14 { 15 if (A[i] != ret) 16 { 17 ret = A[i]; 18 num = 1; 19 } 20 else 21 { 22 num++; 23 if (num == A.size() / 2) 24 { 25 return ret; 26 } 27 } 28 } 29 return ret; 30 } 31 };
赛后AC code
class Solution { public: int repeatedNTimes(vector<int>& A) { if (A.size() == 2) { return A[0]; } int ret = 0; sort(A.begin(), A.end()); int num = A[0]; int times = 1; for (int i = 1; i < A.size(); i++) { if (num != A[i]) { if (times == A.size() / 2) { return A[0]; } break; } else { times++; } } num = A[A.size() - 1]; times = 1; for (int i = A.size()-2;i>=0 ;i--) { if (num != A[i]) { if (times == A.size() / 2) { return num; } break; } else { times++; } } ret = A[A.size() / 2]; return ret; } };
其他:
1.简单的题,随便就过了,如果对时间有要求的话,可能就得用第二种方法才能过了。
不考虑太多,统计每个元素个数就够了。
2.第一code:
1 class Solution: 2 def repeatedNTimes(self, A): 3 """ 4 :type A: List[int] 5 :rtype: int 6 """ 7 n = len(A)//2 8 l = dict() 9 for e in A: 10 if e in l: 11 l[e] += 1 12 else: 13 l[e] = 1 14 for e in l: 15 if l[e] == n: 16 return e
统计个数找个数是N的,可能都没怎么多想吧
第二code:
1 class Solution(object): 2 def repeatedNTimes(self, A): 3 """ 4 :type A: List[int] 5 :rtype: int 6 """ 7 d = set() 8 for num in A: 9 if num not in d: 10 d.add(num) 11 else: 12 return num
感觉更有意思一点,2N个元素,N+1个不同,其中一个还是有N个元素的,那么其他的都是只有一个元素,那么完全可以更快:答案必定是A[A.size()/2]和A[A.size()/2-1]中的一个,如果两者相同,即为结果,否则如果A[A.size()/2-1]==A[A.size()/2-2],是答案,否则A[A.size()/2]是答案。
以上是关于LeetCode961 重复 N 次的元素的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 961 在长度2N的数组中找出重复N次的元素[map] HERODING的LeetCode之路
leetcode961. 在长度2N的数组中找出重复N次的元素
LeetCode 961. 在长度 2N 的数组中找出重复 N 次的元素 / 464. 我能赢吗(博弈) / 675. 为高尔夫比赛砍树