有没有人可以帮助优化此代码

问题描述 投票:-1回答:1

给出一个整数列表和一个总和值,按出现的顺序返回前两个值(请从左边解析),这些总和构成总和。

示例:

sum_pairs([11, 3, 7, 5],         10)
#              ^--^      3 + 7 = 10
== [3, 7]

sum_pairs([4, 3, 2, 3, 4],         6)
#          ^-----^         4 + 2 = 6, indices: 0, 2 *
#             ^-----^      3 + 3 = 6, indices: 1, 3
#                ^-----^   2 + 4 = 6, indices: 2, 4
#  * entire pair is earlier, and therefore is the correct answer
== [4, 2]

sum_pairs([0, 0, -2, 3], 2)
#  there are no pairs of values that can be added to produce 2.
== None/nil/undefined (Based on the language)

sum_pairs([10, 5, 2, 3, 7, 5],         10)
#              ^-----------^   5 + 5 = 10, indices: 1, 5
#                    ^--^      3 + 7 = 10, indices: 3, 4 *
#  * entire pair is earlier, and therefore is the correct answer
== [3, 7]

我的代码:

def sum_pairs(L,I):
    past = {}
    #set the first value in L as my key for dict
    past[L[0]] = 1
    idx = 1
    while idx < len(L):
        needed = I - L[idx]
        if needed in past:
            return [needed, L[idx]]
        past[L[idx]] = 0
        idx += 1
    return None
python sum keyvaluepair
1个回答
0
投票

由于它的O(n)而不是帖子的O(n ^ 2)算法,因此应该更快。>

def sum_pairs(arr, s):
  " O(n) algorithm "
  # Reverse dictionary lookup for values (only keep first entry)
  # It produces a list of indices for a given value
  # Example arr = (10, 5, 5)  => d = {10: [0], 5: [1, 2]}
  d = {}
  for i, v in enumerate(arr):
    d.setdefault(v, []).append(i)

  # Find all possible pairs
  # For each v in dictionary d, we can only use it in a pair if s-v is also in the dictionary
  # so we need to find elements such that both v and s-v are in d (which would be array arr)
  result = [[(x, y) for x in d.get(v, []) for y in d.get(s-v, []) if x < y] for v in d]
  flatten_result = [item for sublist in result for item in sublist]
  if flatten_result:
    # Find the earliest indexes
    min1 = min(flatten_result, key = lambda x: max(x))

    # Return values with earliest indexes
    return arr[min1[0]], arr[min1[1]], min1#, flatten_result
  else:
    return None


print(sum_pairs([11, 3, 7, 5], 10))          # (3, 7, (1, 2))
print(sum_pairs([4, 3, 2, 3, 4], 6))         # (4, 2, (0, 2))
print(sum_pairs([0, 0, -2, 3], 2))           # None
print(sum_pairs([10, 5, 2, 3, 7, 5],  10))   # (3, 7, (3, 4))
print(sum_pairs([5, 9, 13, -3], 10))         # (13, -3, (2, 3))
print(sum_pairs([10, 5, 5], 10))             # (5, 5, (1, 2))
© www.soinside.com 2019 - 2024. All rights reserved.