Почему распаковка кортежей может дать правильный результат, если использование двух строк не дает? - PullRequest
0 голосов
/ 25 марта 2019

Я работал над проблемой "максимального подмассива продукта" и столкнулся с проблемой с моим кодом

Способ, которым я решил эту проблему, был

def maxProduct(nums):
   minProd = maxProd = maximum = nums[0]
   for i in range(1, len(nums)):
      currentNum = nums[i]
      maxProd = max(currentNum, currentNum*maxProd, currentNum*minProd)
      minProd = min(currentNum, currentNum*maxProd, currentNum*minProd)
      maximum = max(maximum, maxProd)
   return maximum

print(maxProduct([-4, -3, -2]))

Мое решение дало бы мне72, но код, который дал бы правильное решение:

def maxProduct(nums):
    minProd = maxProd = maximum = nums[0]
    for i in range(1, len(nums)):
        currentNum = nums[i]
        maxProd, minProd = max(currentNum, currentNum*maxProd, currentNum * minProd), min(currentNum, currentNum*maxProd, currentNum*minProd)
        maximum = max(maximum, maxProd)
    return maximum


print(maxProduct([-4, -3, -2]))

Мое решение и правильное решение, кажется, делают то же самое.Почему бы

maxProd, minProd = max(currentNum, currentNum*maxProd, currentNum * minProd), min(currentNum, currentNum*maxProd, currentNum*minProd)

против

maxProd = max(currentNum, currentNum*maxProd, currentNum*minProd)
minProd = min(currentNum, currentNum*maxProd, currentNum*minProd)

иметь такую ​​большую разницу?

1 Ответ

4 голосов
/ 25 марта 2019

Какое значение maxProd при вычислении второго значения?

В первом примере

max(currentNum, currentNum*maxProd, currentNum * minProd), min(currentNum, currentNum*maxProd, currentNum*minProd)

вычисляется, а затем распаковывается и присваивается.

Во втором примере новое значение maxProd вычисляется и присваивается, а затем используется во втором вычислении.

...