codility上的问题 之二 Alpha 2010

Alpha 2010

问题: 给定一个非空的正整数数组,求它的最短的前缀,包含这个数组里所有种类的数。

          例如:A[] = {2,2,1,0,1}输出的是3,因为A[0],A[1],A[2],A[3]包含了2,1,0所有的数,后面的数都重复了。

数组长度N是10^6,数组元素每个都在[0..N - 1]之内。

要求复杂度:

时间复杂度O(N),空间复杂度O(N)

解答:

   这个题也比较简单。其实就是建立一个hash,如果这个数是之前没出现的数,就把它的位置记录下来,记录最后一个没出重复出现的数的位置即可。至于hash,可以直接用bool数组记录就可以,直接把key作为下标就行。


// you can also use includes, for example:
// #include <algorithm>
int solution(const vector<int> &A) {
    // write your code here...
vector<bool> have;
int n = A.size(), i, r;
    have.resize(n, false);
    for (i = r = 0; i < n; ++i) {
        if (!have[A[i]]) {
            have[A[i]] = true;
            r = i;
        }
    }
    return r;
    
    
}


你可能感兴趣的:(codility上的问题 之二 Alpha 2010)