为什么这个soln比另一个快?

时间:2021-02-17 19:11:40

标签: c++ arrays hashmap unordered-map

问题是 Leetcode 的 N-Repeated Element in Size 2N Array

<块引用>

在大小为 2N 的数组 A 中,有 N+1 个唯一元素,并且恰好这些元素中的一个被重复了 N 次。

返回重复 N 次的元素。

我很困惑请帮忙!

更快的代码

    class Solution {
public:
    int repeatedNTimes(vector<int>& A) {
        auto it = A.begin();
        while(it!=A.end())
        {
            if(count(A.begin(),A.end(),*it)>1)
            {
                break;
            }
            else
                it++;              
        }
        return *it;
    }
};

较慢的代码

    class Solution {
public:
    int repeatedNTimes(vector<int>& A) {
        unordered_map<int,int> u;
        int rep;
        for(auto i: A){
            u[i]++;
            if(u[i]>1){
                rep=i;
            }
        }
        
        return rep;
    }
};

1 个答案:

答案 0 :(得分:0)

这是使用上述方法的一些(未经测试的)代码。我确实假设输入数据采用所描述的形式。如果不是这种情况,此代码将出错。

class Solution
{
public:
    int repeatedNTimes(vector<int>& A) {
        // check for alternating elements at even indexes
        if (A[0] == A[2])
           return A[0];
        // check for alternating elements at odd indexes
        if (A[1] == A[3])
           return A[1];
        // check for first and last being the same
        if (A.front() == A.back())
           return A.front();
        // check adjacent elements
        for (size_t i = 0;; ++i)
        {
            if (A[i] == A[i + 1])
                return A[i];
        }
        return -1;
    }
};

编辑

想到一个错误,我的算法仅在邻接环绕时才有效,即第一个和最后一个元素也被认为是相邻的。我也添加了代码来检查这种可能性。