样本输入:
5
1
2
1
3
1
第一个数字=集合中的成员数N
以下N个号码=成员的ID
我必须找到集合中最长的不同整数的连续序列的大小。在这种情况下,它是{2,1,3}的序列,所以输出为3。
我的暴力解决方案将是生成一个滑动窗口,该窗口的大小每次迭代缩小1。初始大小是输入的大小。因此,对于样本输入,它将首先评估{1、2、1、3、1},如果集合不是唯一的,则将窗口减小到4,然后评估{1、2、1、3}, {2,1,3,1}。继续前进,直到找到唯一的一套。
我认为这种算法将是O(N ^ 2)时间。那么,我该如何优化呢?
答案 0 :(得分:2)
您可以将哈希表用于O(N)
解决方案。简而言之,请跟踪每个唯一元素的最后一个索引以及上次重复发生的时间。每个索引处这两个变量之间的最大值是您无需重复就可以在该索引处返回多远。
为了完整起见,这是一个简单明了的(希望)评论良好的python实现:
def longestDistinctSequence(iterable):
res = 0
# store the indices of each unique element
hashmap = {}
# keep track of how back you can go before you run into a repetition
last_repeat = 0
# loop through each index and item
for index, item in enumerate(iterable):
# how back you can go before you can run into a repetition is the max of:
# 1. The last occurence of this element (zero if this is first instance)
# 2. The last_repeat of the last iteration
last_repeat = max(hashmap.get(item, 0), last_repeat)
# calculate the global maximum
res = max(res, index - last_repeat + 1)
# update the hashmap to reflect the repetition of this element
hashmap[item] = index + 1
return res