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; }