Day24[26/3/24]T128最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
ini
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
ini
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
示例 3:
ini
输入:nums = [1,0,1,2]
输出:3
提示:
0 <= nums.length <= 105-109 <= nums[i] <= 109
解题思路
先用哈希表(集合 set,而不是字典 map)把数组存起来,
然后这样子思考:你先检查一个元素是不是连续字串的开头
比如说,3 是不是开头,就看 2 这个元素在不在哈希表中,如果 2 存在那么 3 就不是开头,就没必要从 3 开始查这个连续子串有多长。如果不存在 2,那么 3 肯定是一个连续子串的开头,那么就检查有没有 4、5、6,检查到最后是几,那么一减不就是这个连续子串的长度么。然后统计一下全局最长就行了。
Code
arduino
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
class Solution
{
public:
int longestConsecutive(vector<int> &nums)
{
int maxLength = 0;
unordered_set<int> set;
for (const auto &num : nums)
{
set.insert(num);
}
for (const auto &num : set)
{
if (set.count(num - 1))
{
// 如果num-1存在就不是开头直接退出
continue;
}
else
{
// 如果num-1不存在,就是开头,统计长度!
int count = 0;
int temp_num = num;
while (set.count(temp_num++))
{
count++;
}
if (count > maxLength)
{
maxLength = count;
}
}
}
return maxLength;
}
};
auto main() -> int
{
Solution sol;
vector<int> nums{1, 2, 3, 4, 5, 9};
cout << "result = " << sol.longestConsecutive(nums) << endl;
}