我正在为this problem编写代码:
给定具有N个元素的阵列A.求出总数(i,j),使得j <1。我和Aj =艾。
这是我的代码:
raw_input()
l = list(map(int, raw_input().split()))
count = 0
for a in range(len(l)):
count = count + l[a+1:].count(l[a])
print(count)
但不幸的是,代码花了很多时间。你有什么建议我可以减少时间消耗吗?我的意思是,如何减少for
循环所消耗的时间。我觉得list.count
方法需要花费很多时间,所以你有什么想法可以替代它。
答案 0 :(得分:1)
您可以使用比.count()
更快的方式检查成员资格来加快速度。例如,dict
查找非常快:
from collections import defaultdict
raw_input()
l = list(map(int, raw_input().split()))
keys = defaultdict(list)
for i, v in enumerate(l):
keys[v].append(i)
for value, keys in keys.items():
print("Value %d appears at indices %s." % (k, ", ".join(keys)))
然后你只需要计算对的数量。
答案 1 :(得分:1)
我终于得到了答案。它将时间消耗减少到非常低的量。 对不起造成的干扰。
raw_input()
l = list(map(int, raw_input().split()))
dictionary = {}
for value in l:
if value in dictionary:
dictionary[value] += 1
else:
dictionary[value] = 0
def sum_till_n(iterable):
return [x*(x+1)/2 for x in iterable]
print(sum(sum_till_n(dictionary.values())))
我希望您了解代码的作用。我以数学的方式看待这个问题。字典dictionary
存储第一个value
之后value
的数量。 sum_till_n
函数是一个函数,它找到n
之前的数字总和。与n=3
类似,它会返回1+2+3
。
答案 2 :(得分:0)
python代码中的微优化不会使当前的O(n ^ 2)复杂度大幅降低。 我建议看看产生较低复杂性的实现。 此链接可以帮助您find total number of (i,j) pairs in array such that i<j and a[i]>a[j]
答案 3 :(得分:0)
让我们花点时间看看问题,而不是实施!
任务是:
给定具有N个元素的阵列A.查找对的总数(i,j) 这样j&lt;我和Aj =艾。
与查找数组中的所有重复内容相同!
查找所有重复项是一项非常常见的任务。
我可以很快想到一个解决方案:
以下是结果数据的示例:
input = [2.0, 1.0, 3.0, 1.0]
# create and sort tuples (I will leave this task to you)
sorted_tuples = [(1.0, 1), (1.0, 3), (2.0, 0), (3.0, 2)]
# find consecutive duplicates (I will leave this task to you)
solution = [(3, 1)]
答案 4 :(得分:-1)
这可能更快,因为使用生成器和切片:
l = [1, 2, 1, 3]
count = 0
for idx, value in enumerate(l):
count += sum(1 for v in l[:idx] if v == value)
print(count)
assert count == 1