Longest Consecutive Sequence
Feb 14
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.
因为有O(N)的限制。
因此用hash来搞。
class Solution { public: int longestConsecutive(vector<int> &num) { unordered_map<int, int> hash; vector<bool> flag(num.size(), false); for (int i = 0; i < num.size(); ++i) { hash[num[i]] = i; } int maxlen = 1; int less = 0, more = 0; for (int i = 0; i < num.size(); ++i) { if (flag[i]) continue; int tmp = num[i]; auto it = hash.find(--tmp); less = 0; while (it != hash.end()) { ++less; flag[it->second] = true; it = hash.find(--tmp); } tmp = num[i]; auto it2 = hash.find(++tmp); more = 0; while (it2 != hash.end()) { ++more; flag[it2->second] = true; it2 = hash.find(++tmp); } tmp = less + more + 1; maxlen = maxlen > tmp ? maxlen : tmp; } return maxlen; } };
class Solution { public: int longestConsecutive(vector<int> &num) { unordered_map<int, bool> m; int len = num.size(); for (int i = 0; i < len; i++) { m[num[i]] = false; } int res = 0; for (int i = 0; i < len; i++) { if (m[num[i]]) continue; int low = num[i], high = num[i]; while (m.count(low) != 0) m[low] = true, low--; while (m.count(high) != 0) m[high] = true, high++; int t = high - low - 1; if (t > res) res = t; } return res; } };