给定一个未排序的整数数组?nums
?,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为?O(n)
?的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
? ? // 间接就给过滤了用过滤的数据进行逻辑+-判断
int findMAX(int& k1, int& k2) {
if (k1 > k2) {
return k1;
}
else {
return k2;
}
}
int longestConsecutive(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
// 用于判定元素是否重复
unordered_set<int> set;
int length = 1;
int maxLength = 1;
// 排序
// 对数组进行排序
sort(nums.begin(), nums.end());
for (int i = 1; i < nums.size(); i++) {
// 当元素存在时, 保持length不变。
// 如果元素已经存在于 set 中,那么插入操作将失败,insert 方法的 second 成员将为 false
if (!set.insert(nums[i]).second) {
continue;
}
// 连续的元素: 翻译下:就是nums[i-1] + 1 = nums[i]
if (nums[i - 1] + 1 == nums[i]) {
length++;
// 当出现多串连续元素时, 取最大length: 。
maxLength = findMAX(length, maxLength);
}
else {
length = 1;
}
}
return maxLength;
}
int main()
{
vector<int> nums = { 2,3,5,6,1,3,5,6,7,5,8,9};
int count=longestConsecutive(nums);
cout << count;
}