文章
7
粉丝
0
获赞
0
访问
760
(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初始...
登录后发布评论
暂无评论,来抢沙发