本题第一时间想到的解法就是排序,但是这样不符合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;
}
};
京公网安备 11010502036488号