文章
327
粉丝
40
获赞
2
访问
39.7k
void CalMulMax(int A[], int res[], int n) {
if (n <= 0) return;
// 初始化:从最后一个元素开始
int max_suffix = A[n-1];
int min_suffix = A[n-1];
res[n-1] = A[n-1] * A[n-1]; // 只有一个元素
// 从倒数第二个元素向前遍历
for (int i = n-2; i >= 0; i--) {
if (A[i] >= 0) {
res[i] = A[i] * max_suffix;
} else {
res[i] = A[i] * min_suffix;
}
// 更新后缀最大值和最小值(包含A[i])
if (A[i] > max_suffix) {
max_suffix = A[i];
}
if (A[i] < min_suffix) {
min_suffix = A[i];
}
}
}
基本思想:从后往前遍历,维护当前后缀的最大值和最小值,根据当前值的正负选择乘最大值或最小值得到结果。
时间复杂度 O(n),空间复杂度 O(1)。
评分及理由
(1)得分及理由(满分4分)
得分:2分
理由:学生基本理解需要从后向前遍历并维护极值,但算法思想存在逻辑错误。学生认为当A[i]≥0时只需乘max_suffix,当A[i]<0时只需乘min_suffix,这种分类讨论不完整。实际上需要考虑A[i]与max_suffix和min_suffix的乘积中的最大值,因为负数乘最小值可能得到正数最大值。思想描述不完整,扣2分。
(2)得分及理由(满分7分)
得分:3分
理由:代码实现存在以下逻辑错误:
1. res[n-1]初始化为A[n-1]*A[n-1]错误,根据题意应该是A[n-1]本身(因为i=j=n-1),扣1分。
2. 计算res[i]时只考虑单一情况(A[i]≥0乘max_suffix,A[i]<0乘min_suffix),没有考虑所有可能的乘积组合,扣2分。
3. 更新max_suffix和min_suffix时只考虑了A[i]本...0乘min_suffix),没有考虑所有可能的乘积组合,扣2分。
登录后发布评论
暂无评论,来抢沙发