完整代码:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int n = nums.size();
if(n)
{
vector<int> hash_ = nums;
sort(hash_.begin(),hash_.end());
int max_r = 1;
int max_t = 1;
for(int i = 0 ; i < n; i++)
{
max_r = max(max_r,max_t);
if(i+1 < n && hash_[i] + 1 == hash_[i+1])
max_t++;
else if(i+1 < n && hash_[i] == hash_[i+1])
continue;
else
max_t = 1;
}
max_r = max(max_r,max_t);
return max_r;
}
return 0 ;
}
};
1. 定义变量n并赋值为nums数组的大小。
int n = nums.size();
2. 如果数组不为空,则将nums数组的元素复制到hash_数组并排序。
if(n)
{
vector<int> hash_ = nums;
sort(hash_.begin(),hash_.end());
3. 初始化两个变量max\_r和max\_t,分别表示当前最长序列的长度和临时序列的长度。这里将max\_r初始化为1,表示至少有1个元素。
int max_r = 1;
int max_t = 1; //至少有一个
4. 然后判断当前元素和下一个元素的关系:如果相邻且不相等,说明找到了一个可能的连续序列的起点;如果相邻且相等,说明当前元素已经出现在了连续序列中,无需处理;否则,说明当前元素不在任何连续序列中,将临时序列长度max\_t重置为1。
for(int i = 0 ; i < n; i++)
5.对于每个元素,首先更新当前最长序列的长度max_r。
max_r = max(max_r,max_t);
6.然后判断当前元素和下一个元素的关系:如果相邻且不相等,说明找到了一个可能的连续序列的起点;如果相邻且相等,说明当前元素已经出现在了连续序列中,无需处理;否则,说明当前元素不在任何连续序列中,将临时序列长度max_t重置为1。
if(i+1 < n && hash_[i] + 1 == hash_[i+1]) //相等略过
max_t++;
else if(i+1 < n && hash_[i] == hash_[i+1]) //大于1 加上
continue;
else //断开 重新计数
max_t = 1;
7. 遍历结束后,更新一次当前最长序列的长度max\_r。
max_r = max(max_r,max_t);
8. 返回最长序列的长度max\_r。
return max_r;
参考他人作者。