文章

7

粉丝

0

获赞

0

访问

760

头像
2025 年 6 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年8月22日 23:37
阅读数 98

(1)先从左边开始遍历,找到一个峰A[i]后,再从这个峰的位置开始往后遍历找谷A[j],维护A[i] - A[j]的最大值。注意峰谷对(i,j)满足i<j,最后求A[i] - A[j]的最大值即可,若最后的最大值为负数,说明不存在这样的峰谷对,返回0

(2)

int fuc(int A[], int n){
    int i = 1, j; //i从位置1开始,跳过第一位
    int ans = -1; //若最后还是负则表示不存在峰谷对
    for (i; i < n - 1; i++){
        if (A[i - 1] < A[i] && A[i + 1] < A[i]){ //说明是峰
            for (j = i + 1; j < n - 1; j++ ){
                if (A[j - 1] > A[j] && A[j + 1] > A[j]){ //说明是谷
                    if (ans < A[i] - A[j])
                        ans = A[i] - A[j]; //更新最大值
                }
            }
        }
    }
    if (ans < 0) return 0;
    return ans;
}   

(3)时间复杂度为O(n^2),空间复杂度为O(n)


评分及理由

(1)得分及理由(满分4分)

学生给出的算法思想是:对于每个峰,向后遍历所有谷,计算差值并维护最大值。这种方法虽然正确,但效率较低,不是高效算法。标准答案采用预处理最小谷值的方法,时间复杂度为O(n),而学生的方法为O(n^2)。题目要求高效算法,因此该设计思想不够高效,扣2分。得2分。

(2)得分及理由(满分7分)

学生代码实现了双循环遍历峰和谷,逻辑正确但效率低。代码中存在以下问题:
1. 内层循环中,对于每个峰,都重新遍历后续所有谷,没有利用预处理优化,导致时间复杂度高。
2. 代码没有处理不存在峰或谷的情况(例如直接返回0),但学生代码通过ans初始...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发