给定一个未排序的整数数组 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
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
思路一(暴力破解法):
1、先进行排序后,再进行查找最长连续序列(注意重复元素的处理)。
2、复杂度分析:
① 时间复杂度:O(nlogn)。sort排序为O(nlogn),遍历查找最长连续序列为O(n)。
② 空间复杂度::O(1)
思路二(哈希表):
1、建立哈希表unordered_set,移除重复元素(增加查找的速度)。
例: [0,3,7,2,5,8,4,6,0,1]降重后为[0,3,7,2,5,8,4,6,1]
2、查找哈希表中连续序列的开始元素并记录连续序列的长度(通过查找哈希表中是否含有比其小1的元素进判断是否是开始元素,如果为开始元素,则开始记录连续长度。)
例:[100,4,200,1,3,2]中从元素100开始,99不在哈希表中则100为连续序列的开始元素,连续序列长度为1。再判断4,3存在哈希表中则不记录连续长度。再判断下一个元素,依次进行下去。
3、通过比较记录的连续长度挑选出最长连续序列。
4、复杂度分析:
① 时间复杂度:O(n),边查找边判断连续长度所以时间复杂度为O(n)
② 空间复杂度:O(n),创建哈希表O(n)
在这里插入代码片
#include
#include
#include
using namespace std;
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;//指定vector中的元素为int类型
//转换成哈希表,去除重复元素
for(const int&num:nums){
num_set.insert(num);
}
int longesStreak = 0; //用于存放最长连续序列
for(const int&num:num_set){
if(!num_set.count(num-1)){ //如果不存在比这个数小1的元素,从这个数字开始计数
int currentNum=num;
int currentStreak=1;
while(num_set.count(currentNum+1)){//查找从num这个数开始连续数字
currentNum+=1; //数字进行连续变化(+1)
currentStreak+=1; //长度+1
}
longesStreak=max(longesStreak,currentStreak);//记录最长长度
}
}
return longesStreak;
}
int main(){
vector<int> nums={0,3,7,2,5,8,4,6,0,1};
//形参是什么形式就需要实参什么形式
int result=longestConsecutive(nums);
cout<<result;
return 0;
}
#include
/*unordered_set是一种基于哈希表(hash table)实现的无序集合。
高效的、无序的、唯一的整型元素集合,适用于需要快速查找、插入和删除操作的场景。
无序性:元素存放不按顺序
唯一性:插入一个已经存在的元素,该操作将不会改变集合的内容。
哈希表实现:查找、插入和删除操作时间复杂度为O(1),在最坏情况下退化为O(n)
insert(value):插入一个元素
find(value):查找一个元素是否存在于集合中,比较返回的迭代器与 end(),以确定元素是否存在:mySet.find(elementToFind)==mySet.end()
erase(value):从集合中删除一个元素。如果元素存在,则删除它;否则,不做任何操作。
size():返回集合中元素的数量
empty():检查集合是否为空
count(value):返回value元素的个数,因进行了降重所以只有0(不存在value)或1(有1个value)
*/
//由于使用了引用(&),它避免了为每个元素创建副本。
//特别是在处理大型数据结构或对象时,这样可以节省内存和提高性能。
//由于使用了 const,在循环体内无法修改 num 的值,这有助于防止意外修改原始数据。
for(const int&num:nums){
num_set.insert(num);
}
unordered_map和unordered_set对比及用法请点击此链接
LeetCode 热题 100_最长连续序列(3_128)原题链接
欢迎大家和我沟通交流(✿◠‿◠)