青训营X豆包MarsCode 技术训练营第四课|豆包MarsCode AI 刷题

66 阅读3分钟

问题描述

小R最近遇到了一个数组问题。他有一个包含 NN 个元素的数组,记作 a1,a2,...,aNa1​,a2​,...,aN​。为了分析这个数组的特性,小R定义了两个函数 L(i)L(i) 和 R(i)R(i),并希望通过这两个函数来找到一些有趣的结论。

  • L(i)L(i) 是满足以下条件的最大的 jj 值:
  • j<ij<i
  • a[j]>a[i]a[j]>a[i]
  • 如果找不到这样的 jj,那么 L(i)=0L(i)=0;如果有多个满足条件的 jj,选择离 ii 最近的那个。
  • R(i)R(i) 是满足以下条件的最小的 kk 值:
  • k>ik>i
  • a[k]>a[i]a[k]>a[i]
  • 如果找不到这样的 kk,那么 R(i)=0R(i)=0;如果有多个满足条件的 kk,选择离 ii 最近的那个。

最终,小R定义 MAX(i)=L(i)∗R(i)MAX(i)=L(i)∗R(i),他想知道在 1≤i≤N1≤i≤N 的范围内,MAX(i)MAX(i) 的最大值是多少。

为了解决这个问题,我们需要对数组中的每个元素计算 L(i)L(i) 和 R(i)R(i) 的值,然后找到 MAX(i)=L(i)×R(i)MAX(i)=L(i)×R(i) 的最大值。

逐步解决方案:

  1. 计算 L(i)L(i)

    • 对于每个元素 a[i]a[i],从 i−1i−1 到 00 遍历,找到最大的 jj 使得 a[j]>a[i]a[j]>a[i]。
    • 如果没有找到这样的 jj,则 L(i)=0L(i)=0。
  2. 计算 R(i)R(i)

    • 对于每个元素 a[i]a[i],从 i+1i+1 到 N−1N−1 遍历,找到最小的 kk 使得 a[k]>a[i]a[k]>a[i]。
    • 如果没有找到这样的 kk,则 R(i)=0R(i)=0。
  3. 计算 MAX(i)MAX(i)

    • 对于每个 ii,计算 MAX(i)=L(i)×R(i)MAX(i)=L(i)×R(i)。
  4. 找到最大值

    • 遍历所有 MAX(i)MAX(i) 的值,找到最大值。

Python 代码实现:

python
def max_value(a):
    N = len(a)
    L = [0] * N
    R = [0] * N
    max_value = 0

    # 计算 L(i)
    for i in range(N):
        for j in range(i-1, -1, -1):
            if a[j] > a[i]:
                L[i] = j
                break

    # 计算 R(i)
    for i in range(N):
        for k in range(i+1, N):
            if a[k] > a[i]:
                R[i] = k
                break

    # 计算 MAX(i) 并找到最大值
    for i in range(N):
        MAX_i = L[i] * R[i]
        max_value = max(max_value, MAX_i)

    return max_value

# 示例
a = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(max_value(a))

解释:

  • 计算 L(i)L(i)

    • 对于 a[0]=3a[0]=3,没有 j<0j<0 使得 a[j]>3a[j]>3,所以 L(0)=0L(0)=0。
    • 对于 a[1]=1a[1]=1,没有 j<1j<1 使得 a[j]>1a[j]>1,所以 L(1)=0L(1)=0。
    • 以此类推,直到 a[10]=5a[10]=5。
  • 计算 R(i)R(i)

    • 对于 a[0]=3a[0]=3,k=2k=2 使得 a[2]=4>3a[2]=4>3,所以 R(0)=2R(0)=2。
    • 对于 a[1]=1a[1]=1,k=2k=2 使得 a[2]=4>1a[2]=4>1,所以 R(1)=2R(1)=2。
    • 以此类推,直到 a[10]=5a[10]=5。
  • 计算 MAX(i)MAX(i)

    • 对于 i=0i=0,MAX(0)=L(0)×R(0)=0×2=0MAX(0)=L(0)×R(0)=0×2=0。
    • 对于 i=1i=1,MAX(1)=L(1)×R(1)=0×2=0MAX(1)=L(1)×R(1)=0×2=0。
    • 以此类推,直到 i=10i=10。
  • 找到最大值

    • 遍历所有 MAX(i)MAX(i) 的值,找到最大值。

这种方法的时间复杂度是 O(N2)O(N2),因为我们对每个元素 ii 进行了两次嵌套循环(一次用于 L(i)L(i),一次用于 R(i)R(i))。空间复杂度是 O(N)O(N),用于存储 LL 和 RR 数组。