本文为Python算法题集之一的代码示例
题目128:最长连续序列
说明:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度,设计并实现时间复杂度为 O(n) 的算法解决此问题
-
正确但超时【使用
list.sort()
或者sorted(list)
,定会超时,因为list
实际是链表】def find_consecutive_length(nums): if not nums: return 0 sortNum = sorted(nums) #超时元凶 max_length = 0 current_length = 1 lastnum = sortNum[0] - 1 for num in sortNum: if num == lastnum: #检测中去重 continue lastnum = num if num + 1 in sortNum: current_length += 1 else: max_length = max(max_length, current_length) current_length = 1 return max(max_length, current_length) numsa = [0,3,7,2,5,8,4,24,6,0,28,30,1] print(find_consecutive_length(anums)) # 运行结果 # 9
-
字典法【使用字典
dict
进行检索】def find_consecutive_length(nums): if not nums: return 0 record = dict() res = 0 for num in nums: if num not in record: #寻找当前值的左边界和右边界是否中断 left = record.get(num - 1, 0) right = record.get(num + 1, 0) length = right + left + 1 #修正左右边界的计数 record[num] = length if left > 0: record[num - left] = length if right > 0: record[num + right] = length res = max(res, length) return res numsa = [0,3,7,2,5,8,4,24,6,0,28,30,1] print(find_consecutive_length(anums)) # 运行结果 # 9
-
集合法【使用集合
set
进行检索】def find_consecutive_length(nums): if not nums: return 0 num_set = set(nums) find_set = set() imax_len = 0 for anum in num_set: if anum in find_set: continue find_set.add(anum) icurr_len = 1 #计算左边界 tmpnum = anum while tmpnum - 1 in num_set: icurr_len += 1 find_set.add(tmpnum - 1) tmpnum -= 1 #计算右边界 tmpnum = anum while tmpnum + 1 in num_set: icurr_len += 1 find_set.add(tmpnum - 1) tmpnum += 1 #更新最长计数器 if icurr_len > imax_len: imax_len = icurr_len return imax_len numsa = [0,3,7,2,5,8,4,24,6,0,28,30,1] print(find_consecutive_length(anums)) # 运行结果 # 9
一日练,一日功,一日不练十日空
may the odds be ever in your favor ~