#python #python-3.x #algorithm #big-o #biginteger
#python #python-3.x #алгоритм #big-o #biginteger
Вопрос:
У меня есть проблема.
Укажите arr
массив целых чисел. Давайте разделим этот массив на 2 последовательных подмассива так, чтобы сумма произведения произведений в этих двух массивах была наибольшей. Поскольку результат может быть очень большим, он будет разделен на остаток 10^9 7
[Ввод] массив целых 2 <= arr.length <= 10^4
чисел. |arr[i]| <= 10^4
.
Например:
- На
arr = [2,4,1,3]
тоmaxProduct(arr) = 14
время .
Пояснение: мы можем разделить на два подмассива [2]
и [4,1,3]
.
- На
arr = [-1,3,4, -2]
тоmaxProduct (arr) = -11
время .
Пояснение: мы можем разделить на два подмассива [-1,3]
и [4, -2]
Вот мое решение:
def mul(arr):
r = 1
for i in arr:
r*=i
return r
def maxProduct(arr):
res_max = mul(arr[0:1]) mul(arr[1:])
for i in range(1,len(arr)):
first_half = arr[0:i]
after_half = arr[i:]
t = mul(first_half) mul(after_half)
if res_max<t:res_max=t
return res_max
Тем не менее, это может быть обработано большим числом.
Я ищу эффективное решение.
Комментарии:
1. Можете ли вы включить исходную ссылку из источника?
2. Исходный источник — вьетнамский: ссылка на английскую версию, которую я опубликовал выше. Это еще один тестовый пример: Ввод: [-1,3,4,-2] Вывод: -11; Ввод: [-4, -10,10,10,2] Вывод: 4002; Ввод: [10,-2,-8,3,-5,-4,-10,10,-1,8] Результат: 960008 @DanielHao
Ответ №1:
Ваш код имеет временную сложность O(N^2)
, которую необходимо уменьшить.
Рассмотрим массив product
, где product[i] = arr[0]*arr[1]....*arr[i]
. Этот массив может быть вычислен за O(N)
один проход. Теперь вам нужно разделить ваш массив на две последовательные части. Давайте рассмотрим подмассивы arr[0 to i-1]
как и arr[i:]
, для данного i
. Мы можем выполнить цикл от i=n-2
до i=1
и посмотреть, где мы получим максимальную сумму.
mod = int(1e9) 7
arr = [2,4,1,3]
n = len(arr)
product_array = [0]*n
product_array[0] = arr[0]
for i in range(1,n):
product_array[i] = product_array[i-1]*arr[i]
ans = float("-inf")
right_product = arr[n-1]
left_product = product_array[n-2]
ans = left_product right_product
for i in range(n-2,0,-1):
right_product = right_product*arr[i]
left_product = product_array[i-1]
curr_sum = left_product right_product
ans = max(ans, curr_sum)
print(ans%mod)
Комментарии:
1. Это лучший способ. Но при работе с отрицательным числом возникает проблема. Например: Ввод: [-1,3,4,-2], вывод должен быть -11. С этим кодом, приведенным выше, результат равен 999999996
2. @SonHaNguyen Вы добавили условие, что «Поскольку результат может быть очень большим, он будет разделен на остаток 10 ^ 9 7». Возьмите
(-11) mod 1e9 7
, и вы получите этот ответ сам по себе. Если это проблема, удалите модуль?3. Хороший анализ и более быстрое время O (n).
Ответ №2:
Вы можете решить проблему таким образом.
import numpy as np
def get_max_product(a):
# Defining initial conditions to beat
maxv = sum([np.prod(a[:1]),np.prod(a[1:])])
best_i = 1
# Iterating the array trying to beat the initial conditions
for i in range(2,len(a)):
sumprod = sum([np.prod(a[:i]),np.prod(a[i:])])
# Updating best scenario in a better one found
if sumprod > maxv:
maxv,best_i = sumprod,i
return a[:best_i],a[best_i:]
get_max_product([2,4,1,3])
Комментарии:
1. Как это O (N)?
2. @AbhinavMathur привет, что было бы с вашей точки зрения и почему?. Кстати, никаких проблем, просто очень хотелось бы знать.
3. Из того, что я знаю,
np.prod(a[:i])
это занимает O (N) времени. Вызов этого N раз должен быть O (N ^ 2)4. @AbhinavMathur имеет смысл. Вычисление произведения становится более сложным в зависимости от длины массива. Удаление этого комментария из моего ответа