文章
156
粉丝
195
获赞
0
访问
28.4k
1)
观察表达式:
∣Ai−Ak∣×(Ai)2|A_i - A_k| \times (A_i)^2∣Ai−Ak∣×(Ai)2
对于固定的 i,Ai2A_i^2Ai2 是常数,可以提到外面。
因此,问题可以转化为:
(Ai)2×max0≤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∣)
其中 AminA_{\min}Amin 是前 i+1 个元素的最小值,AmaxA_{\max}Amax 是前 i+1 个元素的最大值。
因此,我们可以使用一次遍历,维护 preMax 和 preMin,不断更新:
初始化 preMax = A[0], preMin = A[0]
遍历 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 ...
登录后发布评论
暂无评论,来抢沙发