Как ускорить вложенность на l oop in python? - PullRequest
0 голосов
/ 22 марта 2020

Мой алгоритм Leetcode для задачи 3sum не может пройти через 311-й контрольный пример - превышен лимит времени (длина списка 3000)

Вложенный l oop кажется самой неэффективной частью моего алгоритма. Есть ли способ сделать его более эффективным, используя другой подход?

def threeSum(self, nums: List[int]) -> List[List[int]]:
    result = []

    for i, e in enumerate(nums):
        for i2, e2 in enumerate(nums[i+1:]):
            e3 = -1 * (e + e2)
            l = [e,e2,e3]
            l.sort()
            if l in result:
                continue

            nums[i] = ''
            nums[i2+i+1] = ''
            if e3 in nums:
                result.append(l)
            nums[i] = e
            nums[i2+i+1] = e2

    return result

Я также пытался удалить l.sort (), но ограничение по-прежнему превышено:

nums.sort()
    for i, e in enumerate(nums):
        for i2, e2 in enumerate(nums[i+1:]):
            e3 = -1 * (e + e2)
            l = []
            if e3 > e2:
                l = [e,e2,e3]
            elif e3 < e:
                l = [e3,e,e2]
            else:
                l = [e,e3,e2]
            if l in result:
                continue

            nums[i] = ''
            nums[i2+i+1] = ''
            if e3 in nums:
                result.append(l)
            nums[i] = e
            nums[i2+i+1] = e2

    return result

1 Ответ

0 голосов
/ 22 марта 2020

Во-первых, одно основное правило - никогда не менять список, по которому вы перебираете.

Во-вторых, вам нужно изменить способ, которым вы об этом думаете. Подумайте, как вы можете свести существующую проблему к множеству 2-х сумм и решить каждую из них в отдельности.

...