本题第一时间想到的解法就是排序,但是这样不符合O(n)的时间复杂度要求。
另外一种思路就是用一个set记录每个元素的位置,然后遍历数组的元素,对每个元素做向上向下的遍历,统计连续的长度。
几个点:
1 普通的set查找是O(logN)的,改成hash set就可以认为是O(1)的了。
2 在之前序列统计过的数字就不需要再次统计了,用一个vector记录一下就flag可以了。

#include <unordered_map>

class Solution {
public:
    /**
     * 
     * @param num int整型vector 
     * @return int整型
     */
    int longestConsecutive(vector<int>& num) {
        int maxl = 0;
        unordered_map<int, int> um(num.size());
        vector<bool> visited(num.size(), false);

        for(int i = 0; i < num.size(); i++) um[num[i]] = i;
        for(int i = 0; i < num.size(); i++) {
            if(visited[i]) continue;
            int kk = 1;
            for(int n = num[i]+1; ; n++) {
                auto itr = um.find(n);
                if(itr != um.end()) {
                    int pos = itr->second;
                    visited[pos] = true;
                    kk++;
                } else break;
            }
            for(int n = num[i]-1; ; n--) {
                auto itr = um.find(n);
                if(itr != um.end()) {
                    int pos = itr->second;
                    visited[pos] = true;
                    kk++;
                } else break;
            }
            maxl = max(maxl, kk);
        }
        return maxl;
    }
};