关于Set用法链接:Set用法链接
思路一:题目说要O(n)的时间解决,但我第一时间想的是先排序,然后就找连续序列即可。找连续序列是线性扫描的, 时间主要是在排序上, 所以时间复杂度是O(n*logn)
class Solution {
public:
int longestConsecutive(vector<int> &num) {
int n = num.size();
if(n <= 0)
return 0;
sort(num.begin(), num.end());
int res = 0;//最终结果
for(int i = 0; i < n; ){
int sum = 1; //当前最长长度
//和前一位比较
while(i + 1 <n && (num[i +1] - num[i] == 1 || num[i+1] == num[i] ) ){
if(num[i+1] - num[i] == 1)//是连续的加+1
sum++;
i++;
}
i++;
res = res > sum ? res :sum;//更新
}
return res;
}
};
思路二:把数据放到一个集合,然后扫描原来的数组,发现在集合的话就把其删除,并查找其左右邻居
class Solution {
public:
int longestConsecutive(vector<int> &num) {
int n = num.size();
if(n <= 0)
return 0;
set<int>Set;
for(int i = 0; i < n; i++)//放到集合
Set.insert(num[i]);
int res = 1;
for(int i = 0; i < n; i++){
if(Set.find(num[i]) == Set.end() )
continue;
//如果集合有Num[i],就把它删除,并查找它的邻居num[i] - 1
//和num[i] + 1;
Set.erase(num[i]);
int left = num[i] - 1;
int right = num[i] +1;
//查找左邻居
while(Set.find(left) != Set.end()){
//cout<<"left: "<<left<<endl;
Set.erase(left--);
}
//查找右邻居
while(Set.find(right) != Set.end() ){
//cout<<"right : "<<right<<endl;
Set.erase(right++);
}
//最后更新即可
res = res > (right - left - 1) ? res : (right - left - 1);
}
return res;
}
};
思路三:把思路二的Set换成unordered_map