文章

156

粉丝

195

获赞

0

访问

28.4k

头像
2025 年 8 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年11月25日 18:20
阅读数 117

1)

观察表达式:

∣Ai−Ak∣×(Ai)2|A_i - A_k| \times (A_i)^2∣Ai​−Ak​∣×(Ai​)2

  • 对于固定的 i,Ai2A_i^2Ai2​ 是常数,可以提到外面。

  • 因此,问题可以转化为:

(Ai)2×max⁡0≤k≤i∣Ai−Ak∣(A_i)^2 \times \max_{0\le k \le i} |A_i - A_k|(Ai​)2×0≤k≤imax​∣Ai​−Ak​∣

  • 最大值 ∣Ai−Ak∣|A_i - A_k|∣Ai​−Ak​∣ 出现在数组 A 的前 i+1 个元素中的最大值与最小值与 Ai 的差中。

    • 即:max⁡(∣Ai−Amin⁡∣,∣Ai−Amax⁡∣)\max(|A_i - A_{\min}|, |A_i - A_{\max}|)max(∣Ai​−Amin​∣,∣Ai​−Amax​∣)

    • 其中 Amin⁡A_{\min}Amin​ 是前 i+1 个元素的最小值,Amax⁡A_{\max}Amax​ 是前 i+1 个元素的最大值。

因此,我们可以使用一次遍历,维护 preMaxpreMin,不断更新:

  1. 初始化 preMax = A[0], preMin = A[0]

  2. 遍历 i = 0..n-1:

    • 计算 res[i] = (A[i]^2) * max(abs(A[i] - preMax), abs(A[i] - preMin))

    • 更新 preMax = max(preMax, A[i])

    • 更新 preMin = min(preMin, A[i])

2)

void calDiffMax(int A[], int res[], int n) {
    if (n <= 0) return;

    int preMax ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发