查找从 1 个数组拆分的 2 个子数组的最大积

Find max product of 2 subarray split from 1 array

我有问题。

给出一个 arr 整数数组。我们把这个数组分成2个连续的子数组,使这两个数组中乘积的和最大。由于结果可能非常大,因此将除以 10^9+7

的余数

[输入]整数数组 2 <= arr.length <= 10^4|arr[i]| <= 10^4.

例如:

解释:我们可以分成两个子数组[2][4,1,3]

解释:我们可以分成两个子数组[-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

但是,它可以处理大数字。 我正在寻找有效的解决方案。

您的代码的时间复杂度为 O(N^2),需要降低。
考虑一个数组 product,其中 product[i] = arr[0]*arr[1]....*arr[i]。这个数组可以在 O(N) 中计算一次。现在,您需要将数组分成两个连续的部分。对于给定的 i,让我们将子数组视为 arr[0 to i-1]arr[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)

你可以这样解决问题。

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])