一、问题
''' 给定一个未排序的整数数组 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 '''
二、思路
定义函数:首先定义了一个名为 longestConsecutive 的函数,它接受一个整数数组 nums 作为输入参数。
初始化集合:使用 Python 的集合类型(set)创建一个名为 elements 的集合,并将输入数组 nums 中的所有元素添加到这个集合中。这样做的目的是为了能够在 O(1) 的时间内检查一个数字是否在数组中。
初始化变量:定义一个名为 longest_streak 的变量,用于保存找到的最长连续序列的长度。初始值设为0。
遍历数组:使用一个 for 循环遍历输入数组 nums 中的每个数字 num。
检查起始点:对于每个数字 num,首先检查它前面的数字 num - 1 是否在集合 elements 中。如果不在,那么 num 可能是某个连续序列的起始点。
寻找连续序列:如果 num 是起始点,则从这个数字开始,向后查找连续的数字。使用一个 while 循环,每次检查当前数字 current_num 加 1 是否在集合 elements 中。如果在,说明这个数字也是连续序列的一部分,于是将 current_num 加 1,并将当前序列的长度 current_streak 加 1。这个过程一直持续到不能再找到连续的数字为止。
更新最长序列长度:在每次查找后,比较当前序列的长度 current_streak 与已知的最长序列长度 longest_streak。如果 current_streak 更长,则更新 longest_streak 的值。
返回结果:遍历完所有数字后,返回 longest_streak,即为找到的最长的数字连续序列的长度。
三、解法
写法1:不正确
#自己写的
class Solution:
def longestConsecutive(self,nums:list[int]):
elements = set(nums)
longest_streak = 0
for num in nums:
x = num - 1
if x not in nums:
y = num + 1
current_streak =0
while y in nums:
current_streak += 1 #缺少了一个y+=1
if longest_streak < current_streak:
longest_streak = current_streak
return longest_streak
写法2--不太正确
class Solution:
def longestConsecutive(self, nums: list[int]):
elements = set(nums)
longest_streak = 0
for num in elements:#这个得用nums
x = num - 1
if x not in elements:
y = num + 1
current_streak = 0#代表num此时开始做起点,长度为1,写0 是错误的,因为写了0,所以长度一直是少了1
while y in elements:
current_streak += 1
y += 1
return current_streak#这个不对,不能返回
if longest_streak < current_streak:
longest_streak = current_streak
return longest_streak
写法3:标准
class Solution:
def longestConsecutive(self, nums: list[int]):
elements = set(nums)
longest_streak = 0
for num in nums:
x = num - 1
if x not in elements:
y = num + 1
current_streak = 1
while y in elements:
current_streak += 1
y += 1
if longest_streak < current_streak:
longest_streak = current_streak
return longest_streak
四、学习汇总:
set(),是集合类型。set(nums)是把nums列表转化为集合类型是数据
在 Python 中,集合(Set)和列表(List)是两种不同的数据结构,它们有以下主要区别:
1. **元素唯一性**:
- 集合中的元素必须是唯一的,不允许重复。
- 列表中的元素可以重复出现。
2. **有序性**:
- 列表是有序的,元素按照添加顺序排列。
- 集合是无序的,元素没有特定的顺序。
3. **索引和切片**:
- 列表支持通过索引或切片来访问和操作元素。
- 集合不支持索引和切片,无法直接访问或修改特定位置的元素。
4. **性能**:
- 集合在检查元素是否存在时通常比列表更快,因为它们使用哈希表来存储元素。
- 列表在遍历或访问元素时通常比集合更快,因为它们是有序的。
5. **可变性**:
- 列表是可变的,可以添加、删除和修改元素。
- 集合也是可变的,但不能通过索引来修改元素。相反,使用 `add()`、`remove()` 或 `discard()` 方法来操作元素。
6. **初始化**:
- 列表可以通过方括号 `[]` 或 `list()` 函数来初始化。
- 集合可以通过大括号 `{}` 或 `set()` 函数来初始化。
7. **用途**:
- 列表通常用于存储有序的、可能重复的数据。
- 集合通常用于去除重复项、进行集合操作(如交集、并集、差集)或快速检查元素是否存在。