我希望将(python)问题的效率从O(n^2)
提高到O(n)
。问题是这样的,我有两个数组k=[11,11,13,11,12,15]
和l=[7,5,10,9,5,9,11]
。我想通过从每个数组中选择一个元素来找到max sum
,并且每个数组中元素的索引应相差3。
对于上述两个数组,它应该给我24的总和。我能想到的蛮力解决方案是以笛卡尔方式遍历两个列表,效率为O(n^2)
。下面是我的代码。
max=0
for i in range(len(array_k)):
for j in range(len(array_l)):
if (array_k[i]+array_l[j])>max and abs(i-j)>=3:
max=array_k[i]+array_l[j]
return max
请让我知道如何提高此问题的效率。
答案 0 :(得分:0)
应该给我总计24
实际上是25,但无论如何,我认为我得到了 N log N 解决方案:
array_k = [11, 11, 13, 11, 12, 15]
array_l = [7, 5, 10, 9, 5, 9, 11]
new_k = [(pos, val, True) for pos, val in enumerate(array_k)]
new_l = [(pos, val, False) for pos, val in enumerate(array_l)]
r = new_k + new_l
r.sort(key=lambda el: el[1], reverse=True)
first_pos = r[0][0]
first_val = r[0][1]
first_type = r[0][2]
for i in range(1, len(r)):
pos, value, type_ = r[i]
if type_ is not first_type and abs(pos - first_pos) >= 3:
print("MAX = ", first_val + value)
break
让我知道您是否需要进一步的解释。