文章

78

粉丝

0

获赞

0

访问

3.4k

头像
2025 年 6 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年8月7日 17:19
阅读数 9

(1)首先遍历数组,记录所有峰和谷的位置。峰的位置满足 A[i] > A[i-1] 且 A[i] > A[i+1],谷的位置满足 A[i] < A[i-1] 且 A[i] < A[i+1]。

  • 对于每一个峰的位置 i,我们需要在 i 之后的所有谷中找到最小的 A[j],因为 A[i] - A[j] 的最大值对应于 A[j] 的最小值。

  • 为了提高效率,可以预处理谷的最小值数组 min_valley,其中 min_valley[j] 表示从位置 j 到数组末尾的最小谷值。

  • 然后对于每一个峰 i,找到 i 之后的最小谷值,计算 A[i] - min_valley_after_i,并记录最大值。

(2)

int findMaxPeakValleyDifference(int A[], int n) {
    if (n < 3) return 0; // 至少需要3个元素才能有峰或谷

    int max_diff = 0;
    int min_valley_after = INT_MAX; // 当前峰之后的最小谷值

    // 从后往前遍历,记录当前的最小谷值
    for (int i = n - 2; i >= 1; --i) {
        if (A[i] < A[i-1] && A[i] < A[i+1]) { // 谷
            if (A[i] < min_valley_after) {
                min_valley_after = A[i];
            }
        } else if (A[i] > A[i-1] && A[i] > A[i+1]) { // 峰
            if (min_valley_after != INT_MAX) {
                int curren...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发