【用python解LeetCode 热题100】【哈希】3、最长连续序列

一、题目描述:

给定一个未排序的整数数组 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

示例 3:
输入:nums = [1,0,1,2]
输出:3

提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109

解法1:

思路:
1、先将列表使用sort()函数排序得到新列表sort_list
2、创建空字典hash_table(哈希表)
3、从头遍历新列表sort_list
4、如果遍历到的数字n-1不在hash_table里,hash_table[n] = 1;如果遍历到的数字n-1在hash_table里,hash_table[n] = hash_table[n-1] + 1
5、输出字典中最大的value值

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        sorted_list = sorted(nums)
        hash_table = {}
        for n in sorted_list:
            if n-1 not in hash_table:
                hash_table[n] = 1
            else:
                hash_table[n] = hash_table[n-1] + 1
        return max(list(hash_table.values()))

解法1存在如下问题:
1、时间复杂度不满足要求
题目要求时间复杂度为 O(n),但 sorted() 的时间复杂度是 O(n log n)。

2、未处理空数组
当输入 nums 为空时,max(list(hash_table.values())) 会抛出 ValueError。

3、重复元素冗余操作
排序后重复元素会导致哈希表的重复写入,虽然不影响结果,但效率降低。

解法2:

使用set()函数去重优化解法1后的解法:

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        else:
            sorted_list = sorted(list(set(nums)))# set去重
            hash_table = {}
            for n in sorted_list:
                if n-1 not in hash_table:
                    hash_table[n] = 1
                else:
                    hash_table[n] = hash_table[n-1] + 1
            return max(list(hash_table.values()))

二、补充知识点:

1、set()函数

set() 是 Python 中用于创建集合(Set)的内置函数。集合是一种无序、不重复元素的容器,常用于快速查找、去重和集合运算。以下是详细解释:

  1. 集合的特性
    在这里插入图片描述
  2. 创建集合

方法 1:直接使用花括号 {}

my_set = {1, 2, 3}
print(type(my_set))  # 输出:<class 'set'>

方法 2:使用 set() 函数

my_set = set([1, 2, 2, 3])  # 从列表转换
print(my_set)  # 输出:{1, 2, 3}

my_set = set("hello")       # 从字符串转换
print(my_set)  # 输出:{'h', 'e', 'l', 'o'}(去重后)
  1. 在算法中的应用场景

(1) 去重

nums = [1, 2, 2, 3, 3]
unique_nums = list(set(nums))  # 去重后:[1, 2, 3]

(2) 快速查找元素是否存在

# 查找列表中的元素(时间复杂度 O(n))
if target in my_list: ...

# 查找集合中的元素(时间复杂度 O(1))
if target in my_set: ...

(3) 集合运算

# 找出两个列表的交集
list1 = [1, 2, 3]
list2 = [2, 3, 4]
common = set(list1) & set(list2)  # {2, 3}

注意使用set([2,1,3])输出结果不一定是(1,2,3)!!!
集合的特性
(1) 无序性
集合中的元素没有固定顺序,因此输出顺序可能与输入顺序不同:

print(set([2, 1, 3]))  # 可能输出 {1, 2, 3} 或 {2, 1, 3} 等

(2) 元素唯一性
集合会自动去除重复元素:

set([2, 2, 1, 3])  # 输出:{1, 2, 3}

(3) 高效查找
集合基于哈希表实现,检查元素是否存在的时间复杂度为 O(1):

my_set = set([2, 1, 3])
print(2 in my_set)  # 输出:True(极快!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值