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;
}
本文介绍了一个高效的算法,用于找出给定数组中包含所有不同元素的最短前缀长度。算法利用哈希表来跟踪数组元素的首次出现,并通过迭代更新最短前缀长度。

被折叠的 条评论
为什么被折叠?



