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

 

提示:

  1. 4 <= A.length <= 10000
  2. 0 <= A[i] < 10000
  3. 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 数组哈希表重复 N 次的元素(961)

LeetCode 961 在长度2N的数组中找出重复N次的元素[map] HERODING的LeetCode之路

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

LeetCode 961. 在长度 2N 的数组中找出重复 N 次的元素 / 464. 我能赢吗(博弈) / 675. 为高尔夫比赛砍树

LeetCode 961. N-Repeated Element in Size 2N Array

「 每日一练,快乐水题 」961. 在长度 2N 的数组中找出重复 N 次的元素