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_; }; 哈希表的实现