zoukankan      html  css  js  c++  java
  • Longest Consecutive Sequence

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

    For example,
    Given [100, 4, 200, 1, 3, 2],
    The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

    Your algorithm should run in O(n) complexity.

    虽然AC, 但仍未达标, O(n)

    class Solution {
    public:
        int longestConsecutive(vector<int> &num) 
        {
            int len = num.size();
            if(len<=1)
                return len;
            sort(num.begin(),num.end());
            int numb=1;
            int tem;
            for(int i=1;i<len;i++)
            {
                tem = 1;
                while(i<len&&(num[i]==num[i-1]+1)||(num[i]==num[i-1]))//这里没有i<len老出错, 哎~
                {
                    if(num[i]==num[i-1])
                    {
                        i++;
                        continue;
                    }
                    tem++;
                    i++;
                }
                if(tem>numb)
                    numb = tem;
            }
            return numb;
        }
    };


    转载一个符合要求的算法hash


    classSolution
    {
    public:
        int longestConsecutive(std::vector<int> &num)
        {
            for(int i = 0; i < num.size(); ++i)
            {
                flags_.insert(num[i]);
            }
                
            int maxLen = 0;
            
            for(int i = 0; i < num.size(); ++i)
            {
                int ascendingMax = FindConsecutiveNumbers(ASCENDING, num[i]);
                int decendingMax = FindConsecutiveNumbers(DECENDING, num[i] - 1);
                
                
                if(ascendingMax + decendingMax > maxLen)
                {
                    maxLen = ascendingMax + decendingMax;
                }
            }
            
            return maxLen;
        }
        
    private:
        enum OrderBy
        {
            ASCENDING,
            DECENDING
        };
        
        int FindConsecutiveNumbers(OrderBy orderBy, int value)
        {
            int maxLen = 0;
            
            while(flags_.find(value) != flags_.end())
            {
                ++maxLen;
                
                flags_.erase(value);
                
                if(orderBy == ASCENDING)
                {
                    ++value;
                }
                else
                {
                    --value;
                }        
            }
            
            return maxLen;
        }
        
        std::unordered_set<int> flags_;
    };
    
    哈希表的实现


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    PTA 7-6 列出连通集(深搜+广搜)
    TZOJ 2648 小希的迷宫(并查集)
    HDU 3342 Legal or Not(拓扑排序)
    哈夫曼树
    mst
    [THUWC2017]随机二分图
    视察
    [bzoj3274]Circle
    [bzoj3273]liars
    求导相关
  • 原文地址:https://www.cnblogs.com/vintion/p/4116927.html
Copyright © 2011-2022 走看看