Python3学习笔记:给出一个无序的整型列表,找出最长连续元素序列的长度,时间复杂度要求在线性时间内

给出一个无序的整型列表,找出最长连续元素序列的长度,时间复杂度要求在线性时间内。

例如: 输入:[8,1,9,3,2,4],那么其最长连续序列是[1,2,3,4],即输出长度为4

问题简单,但是要考虑时间复杂度为O(n),比较复杂一些。

方法一

根据python中的特有的赋值思想——引用,进行求值。

a = [0]
b = a
c = [0]
print(id(a), id(b), id(c))

b[0]=b[0] + 1   # 更改b中元素值的大小
print(a, b, c)


# 输出结果
91202888 91202888 55680584      # a,b 变量指向的地址相同。
[1] [1] [0]                     # a,b 发生变化,c 未变

上述a,b变量指向同一个地址的对象,c则指向另一个地址;
更改b中的元素的值,a中元素的值,也会跟着变化。即利用这个性质,对整型列表中连续序列的元素计数。

代码如下

def find_longest_squece1(src):
    value_set = set()   # 存放元素
    value_dict = {}     # 存放元素和标记的键值对
    for i in src:
        if i not in value_set:
            value_set.add(i)    
            value_dict[i] = [1]   # 添加标记记录连续序列的元素个数,利用赋值引用的性质,一个标记改变,其他跟随改变
            if i+1 in value_set and i-1 in value_set:   # 当前后元素都存在时
                value_dict[i+1][0] = value_dict[i+1][0] + 2  # 更新标记,元素个数增2
                value_dict[i] = value_dict[i+1]
                value_dict[i-1] = value_dict[i+1]
            elif i-1 in value_set:  # 只存在前一个元素时
                value_dict[i-1][0] = value_dict[i-1][0] + 1
                value_dict[i] = value_dict[i-1]
            elif i+1 in value_set:  # 只存在后一个元素时
                value_dict[i+1][0] = value_dict[i+1][0] + 1
                value_dict[i] = value_dict[i+1]
    return max(value_dict.values(), key=lambda x:x[0])[0]	# max()方法时间复杂度为O(n)

print(find_longest_squece1([8,1,9,3,2,4]))

# 结果如下
4

方法二

1、将序列中元素,转为集合,即将元素hash
2、遍历集合中元素,用序列最小值叠加1,直到所得的值不在集合内,获得此连续序列的长度
3、更新连续序列长度,最终获取最大值
代码如下

def find_longest_squece2(src):
    max_count = 0
    src = set(src)  # hash
    for i in src:
        if i-1 not in src:  # 序列最小值进入
            num = i + 1
            while True:
                num += 1
                if num not in src:  # 当值不在集合中时,退出。
                    break
            max_count = max(max_count, num-i)
    return max_count

print(find_longest_squece2([8,1,9,3,2,4]))

# 结果如下
4

总结

相比较,方法二较为简洁,计算效率也更高。

你可能感兴趣的:(Python3学习笔记)