来自两个数组的最大总和,每个数组选择一个元素,以使它们的索引相差3

时间:2019-04-30 22:15:20

标签: python arrays list

我希望将(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

请让我知道如何提高此问题的效率。

1 个答案:

答案 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

让我知道您是否需要进一步的解释。