Longest Consecutive Sequence
- 问题描述:给定一个乱序的数组,让你计算最长的包含连续数字的子集大小是多少?要求O(n)的时间复杂度。比如说[100, 0, 2, 1, 100, 3, 5, 200, 4] => {0, 1, 2, 3, 4, 5}.所以长度是5.
- 分析
- 对于这么一个乱序的数组,并且要求O(n)的时间复杂度,所以我们肯定不能排序。
- 我们首先可以利用map将每个哪些数字出现了记录下来。
- 然后我们再遍历每个数字,如果数字在map中,我们再分别对数字从数轴上向左或者向右找到边界。
- 然后计算整个区域的长度,并且将已经出现过的数字从map中删除,这样可以保证我们是O(N)的时间复杂度。
- 长度中的最大值就是我们的结果。
- 代码:
int longestConsecutive(vector<int>& nums) {
if(nums.empty())
return 0;
unordered_map<int, int> unordered_map1;
for(auto c: nums){
unordered_map1[c] += 1;
}
int len = -1;
for(auto c: nums){
int cur_len = 1;
if(unordered_map1[c]==0)
continue;
bool left_flag = true;
bool right_flag = true;
int step = 1;
while(right_flag || left_flag){
long long left_c = c - step;
long long right_c = c + step;
if(left_flag && unordered_map1[left_c] >= 1){
cur_len += 1;
unordered_map1[left_c] = 0;
}else{
left_flag = false;
}
if(right_flag && unordered_map1[right_c] >= 1){
cur_len += 1;
unordered_map1[right_c] = 0;
}else{
right_flag = false;
}
step += 1;
}
len = max(len, cur_len);
}
return len;
}