LeetCode 热题 100_最长连续序列(3_128_中等_C++)(哈希表)(unordered_set;for(const int&num:nums)

LeetCode 热题 100_最长连续序列(3_128)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
      • 代码实现(思路二):
      • 部分代码解读

题目描述:

给定一个未排序的整数数组 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)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

你可能感兴趣的:(LeetCode,热题,100,散列表,leetcode,c++,哈希表)