给出一个整数数组,返回一个新数组,其中的每个元素 新数组是该数组右边较小元素的数量 原始输入数组中的元素。 例如,给定数组[3,4,9,6,1],返回[1,1,2,1,1,0]。
import bisect
nums = list(input().split())
nums_to_the_right = []
result = []
sorted_nums = []
for num in reversed(nums):
index = bisect.bisect_left(sorted_nums, num)
result.append(index)
bisect.insort(sorted_nums, num)
result.reverse()
print(result)
此代码将打印正确的结果。 bisect_left函数应返回索引,当前元素必须对该索引进行排序。 insort函数将元素放入数组中,以使数组保持排序状态。我希望整个代码都具有O(n ^ 2)复杂性,但是据说需要O(nlogn)才能起作用。告诉我,为什么?
答案 0 :(得分:0)
bisect
模块使用binary search algorithm查找插入索引。使用此算法- O(logn),每次插入的复杂性(您可以通过以下链接阅读非常详细的说明)。您有 n 个元素,因此最终复杂度为 O(nlogn)。最终的result.reverse()
复杂度为 O(n),因此可以在汇总复杂度计算中将其省略。