1. 程式人生 > >求一個數組的最長連續子序列

求一個數組的最長連續子序列

分析:

如果允許O(nlogn)的複雜度,那麼可以先排序,可是本題要求O(n)。

由於序列裡的元素是無序的,又要求O(n),首先要想到用雜湊表。

用一個雜湊表unordered_map<int,bool> used 記錄每個元素是否使用,

對每個元素,以該元素為中心,往左右擴張,直到不連續為止,記錄下最長的長度。

class Solution 
{
public:
int longestConsecutive(const vector<int>& nums)
{
    unordered_map<int,bool> used;
    for(auto i:nums)
        used[i]=false;
    int longest=0;
    for(auto i:nums)
    {
        if(used[i])
            continue;
        int length=1;
        used[i]=true;
        for(int j=i+1;used.find(j)!=used.end();++j)
        {
            used[j]=true;
            ++length;
        }
        for(int j=i-1;used.find(j)!=used.end();--j)
        {
            used[j]=true;
            ++length;
        }
        longest= longest > length ? longest:length;
    }
    return longest;
}
};