Python面试宝典第11题:最长连续序列
创始人
2025-01-09 22:09:00
0次

题目

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

排序法

        排序法在最坏情况下的时间复杂度为O(nlogn),不满足本题时间复杂度为O(n)的要求。但它提供了一个不同的解题视角,还是值得我们学习一下的。使用排序法求解本题的主要步骤如下。

        1、首先,将输入数组nums进行排序。这一步的目的是使得连续的数字相邻,便于后续遍历查找连续序列。

        2、对排序后的数组进行遍历,并初始化两个变量。其中,current_streak用于记录当前连续序列的长度,longest_streak用于记录遇到的最长连续序列的长度。

        3、在遍历过程中,比较当前元素与前一个元素的关系。如果当前元素正好比前一个元素大1,则说明它们属于同一个连续序列,此时current_streak加1。否则,说明遇到了新的序列起点,此时更新longest_streak(如果current_streak大于longest_streak),并将current_streak重置为1。

        注意:需要对数组中存在相同元素的情况进行额外处理,以避免重复元素导致的误判。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def get_longest_consecutive_by_sort(nums):     if not nums:         return 0          nums.sort()     longest_streak = 1     current_streak = 1     for i in range(1, len(nums)):         # 避免重复元素导致的误判         if nums[i] != nums[i-1]:             if nums[i] == nums[i-1] + 1:                 current_streak += 1             else:                 longest_streak = max(longest_streak, current_streak)                 current_streak = 1          return max(longest_streak, current_streak)  print(get_longest_consecutive_by_sort([100, 4, 200, 1, 3, 2])) print(get_longest_consecutive_by_sort([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]))

哈希法

        使用哈希法的基本思想如下:首先,将所有数组中的元素添加到哈希集合中,以便快速查询一个数字是否已存在。然后,遍历数组中的每个元素,对于每个元素,检查它是否是某个连续序列的起始点(即检查num - 1不在哈希集合中)。如果是起始点,则尝试向后扩展序列,同时更新最长序列长度。为了避免重复计算,每当我们确定了一个数字属于某个连续序列时,就将其从哈希集合中移除。使用哈希法求解本题的主要步骤如下。

        1、初始化。创建一个空的哈希集合num_set,用来存储数组中的所有数字。

        2、填充哈希集合。遍历数组nums,将所有元素添加到哈希集合num_set中。

        3、遍历并检查连续性。再次遍历数组nums,对于每个元素,检查它是否能作为连续序列的起点,即检查 num - 1 是否不在 num_set 中。

        4、扩展序列并更新长度。如果找到了一个起点,就尝试通过不断检查 num + 1 是否在 num_set 中来扩展序列,并相应地更新最长序列长度。

        5、移除已访问元素。在扩展序列的过程中,将访问过的数字从 num_set 中移除,以避免之后的重复计算。

        6、返回找到的最长连续序列的长度。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def get_longest_consecutive_by_hash(nums):     if not nums:         return 0      num_set = set(nums)     longest_streak = 0          for num in num_set:         if num - 1 not in num_set:             current_num = num             current_streak = 1                          while current_num + 1 in num_set:                 current_num += 1                 current_streak += 1                          longest_streak = max(longest_streak, current_streak)          return longest_streak  print(get_longest_consecutive_by_hash([100, 4, 200, 1, 3, 2])) print(get_longest_consecutive_by_hash([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]))

总结

        使用哈希法求解本题时,每个元素仅被访问两次:一次加入哈希集合,另一次作为序列起点检查。遍历和序列扩展操作均在常数时间内完成,故总的时间复杂度为O(n),满足本题的要求。另外,哈希法需要额外的空间来存储哈希集合。最坏情况下,数组中的所有元素都是唯一的,因此哈希集合将存储n个元素,空间复杂度为O(n)。

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...