文章

156

粉丝

195

获赞

0

访问

28.5k

头像
2025 年 6 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年11月21日 17:47
阅读数 153

1)

关键观察:
要找 max(峰A[i] - 谷A[j]),且 i < j
也就是说,对于每个谷 A[j],我们只能考虑它之前的峰。
那么,如果我们从左到右扫描,记录到当前位置之前遇到的最大的峰的值,那么对于每个谷,我们直接计算 max_peak_so_far - A[j],并更新全局最大值。

步骤:

  1. 先找出所有峰和谷的位置(一次遍历)。

  2. 从左到右扫描数组,维护一个变量 max_peak 表示当前位置之前(包括当前位置)遇到的所有峰的最大值(初始化为一个很小的数,比如 -∞)。

  3. 当遇到一个谷时,计算 max_peak - 谷值,更新全局最大差值。

  4. 当遇到一个峰时,更新 max_peak = max(max_peak, 峰值)

注意:峰必须在谷之前(i < j),所以更新峰后再遇到谷才有效。
实际上我们按顺序扫描数组,先更新峰,再在遇到谷时计算差值。

2)

int findMaxPeakValleyPair(vector<int>& A) {
    int n = A.size();
    if (n < 3) return 0;

    int max_peak = INT_MIN;
    int max_diff = 0;

    for (int i = 1; i < n - 1; i++) {
        // 检查是否为峰
        if (A[i] > A[i-1] && A[i] > A[i+1]) {
            if (A[i] > max_peak) max_peak = A[i];
        }
        // 检查是否为谷
        if (A[i] < A[i-1] && A[i] < A[i+1]) {
            if (max_peak != INT_MIN) {
                int diff = max...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发