📌  相关文章
📜  对于给定数组中的每个元素,最大化两个最接近的其他数组的乘积(1)

📅  最后修改于: 2023-12-03 14:53:38.874000             🧑  作者: Mango

最大化数组中每个元素的乘积

我们需要在给定数组中找到每个元素的两个最接近的其他元素,使它们的乘积最大。这可以通过以下步骤实现:

1. 找到每个元素左边的最接近元素

遍历数组,维护一个栈s。对于每个元素,弹出栈中比它小的元素,直到栈顶元素比它大,将此时栈顶元素下标记录在一个数组left[]中,如果栈为空,则记录-1。

2. 找到每个元素右边的最接近元素

重复步骤1,但是遍历数组时要从右向左遍历,将记录在数组right[]中。

3. 计算每个元素左右两边元素的乘积并取最大值

遍历数组,对于每个元素,计算该元素左右两边元素的乘积并取最大值即可。具体实现请看下面的代码片段。

def maximize_product(arr):
    n = len(arr)
    s = []
    left = [-1] * n
    right = [n] * n

    # 找到每个元素左边的最接近元素
    for i in range(n):
        while s and arr[s[-1]] < arr[i]:
            s.pop()
        if s:
            left[i] = s[-1]
        s.append(i)

    # 找到每个元素右边的最接近元素
    s.clear()
    for i in range(n - 1, -1, -1):
        while s and arr[s[-1]] < arr[i]:
            s.pop()
        if s:
            right[i] = s[-1]
        s.append(i)

    # 计算每个元素左右两边元素的乘积并取最大值
    ans = float('-inf')
    for i in range(n):
        ans = max(ans, (left[i] + 1) * (right[i] + 1) * arr[i])

    return ans

以上代码的时间复杂度为O(n),因为遍历了数组三次,每次的复杂度都是O(n)。