说我有第一个清单:
list = [0, 1, 0, 4, 3, 1, 2, 5, 1, 12, 9, 32, 31, 19, 44, 3]
第一个列表中所有数字n的第二个列表,使得n = max(list [:n]),如下所示:
list_max = [0, 1, 4, 5, 12, 32, 44]
说我想获取列表中list_max的索引位置的列表,该列表应该等于:
list_max_pos = [0, 1, 3, 7, 9, 11, 14]
我可以做类似的事情:
list_max_pos = []
m = len(list_max)
for n in range (0, m):
list_max_pos.append(list.index(list_max[n]))
问题在于,如果原始列表过长,即数百万个值长,则效率会非常低下,因为它每次都会从头开始搜索。为了节省时间,我可以开始搜索每个新值的索引,而最后一个值的索引不存在。也就是说,在列表中的位置11找到32之后,我可以从位置12开始搜索44,而不是从0开始搜索。
我将如何实施?
答案 0 :(得分:3)
仅遍历列表一次就在您浏览列表时存储了索引值。这可以解决O(n)
时间复杂度的问题。
inputlist = [0, 1, 0, 4, 3, 1, 2, 5, 1, 12, 9, 32, 31, 19, 44, 3]
maxvalue = -1
answer= []
for index,element in enumerate(inputlist):
if element > maxvalue:
maxvalue = element
answer.append(index)
print(answer)
注意:
插入O(1)
中的列表中的摊销时间复杂度。插入的渐近最坏情况运行时复杂度为O(n)
,平均情况为O(1)
。您可以使用出队来稍微加快速度。插入出队队列的渐近和摊销的最坏情况运行时复杂度为O(1)
。
您可以在此处详细了解-> TimeComplexity of python datastructures
输出
[0, 1, 3, 7, 9, 11, 14]