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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值