问题描述
小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) 的最大值。
逐步解决方案:
-
计算 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。
-
计算 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。
-
计算 MAX(i)MAX(i) :
- 对于每个 ii,计算 MAX(i)=L(i)×R(i)MAX(i)=L(i)×R(i)。
-
找到最大值:
- 遍历所有 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 数组。