文章
50
粉丝
0
获赞
0
访问
2.2k
(1)设置变量max存放最大的峰,设置min存放最大的谷遍历查找峰和谷,设置flag1和flag2来判断存在峰和谷,如果flag1和flag2都为true返回max-min否则返回0
(2)
int find(vector<int>&arr){
int n=arr.size();
int ans=0;
bool flag=false;
for(int i=1;i<n-1;i++){
if(arr[i]>arr[i-1]&&arr[i]>arr[i+1]){
for(int j=i+1;j<n-1;j++){
if(arr[j]<arr[j-1]&&arr[j]<arr[j+1]){
if(flag){
ans=arr[i]-arr[j];
flag=true;
}else{
ans=max(arr[i]-arr[j],ans);
}
}
}
}
}
return ans;
}
(3)时间复杂度是O(n^2)递归2重循环,空间复杂度是O(1)只有几个固定的变量
评分及理由
(1)得分及理由(满分4分)
学生给出的基本设计思想是:设置变量max和min来存放峰和谷,但实际代码中并未使用max和min,而是使用了双重循环遍历所有峰和谷的组合。思路描述不清晰,且未体现高效算法的设计(如预处理最小谷值),与标准答案的高效思路不符。但基本思路是遍历峰和谷的组合,因此给1分。
(2)得分及理由(满分7分)
学生代码存在以下问题:
1. 代码逻辑错误:flag变量初始为false,但内层循环中若找到谷,第一次进入时设置ans为当前差值并将flag设为true,但后续进入else分支时,ans更新逻辑正确。但flag的命名和用法不清晰(应表示是否找到过峰谷对),但功能基本正确。
2. 效率问题:使用双重循环遍历所有峰和谷的组合,时间复杂度为O(n^2),不符合题目要求的“高效算法”(标准答案为O(n))。
3. 边界处理:未考虑数组长度小于3的情况(直接返回0),但代码中循环条件已避免越界。
4. ...
登录后发布评论
暂无评论,来抢沙发