文章
69
粉丝
0
获赞
0
访问
10.6k
(1)
创建长度均为n的一维整型数组sufMax和sufMin,分别记录区间[i, n]的最大值和最小值,可以得到res[i]= max(res[i] * sufMax[i], res[i] * sufMin[i])。
即res为正数时,乘一个最大的数;当res为负数时,乘一个最小的数。
sufMax和sufMin可以优化为两个整数,表示后缀最大值和最小值。
(2)
void calMulMax(int A[], int res[], int n)
{
int sufMAX = -n, sufMin = n; // 初始化后缀最大值和最小值
for(int i = n - 1; i >= 0; i--) {
sufMax = max(A[i], sufMax); // 后缀最大值
sufMin = max(A[i], sufMin); // 后缀最小值
res[i] = max(A[i] * sufMax, A[i] * sufMin); // 计算res[i]
}
}
(3)
时间复杂度O(n),空间复杂度O(1)
评分及理由
(1)得分及理由(满分4分)
学生作答的基本设计思想正确:通过维护后缀最大值和最小值来计算每个A[i]与后续元素乘积的最大值,并指出当A[i]为正数时乘最大值、为负数时乘最小值。思路与标准答案一致,表述清晰。得4分。
(2)得分及理由(满分7分)
学生代码存在以下逻辑错误:
1. 变量名不一致:第3行定义sufMIN,第5行使用sufMin(大小写不一致),第6行使用sufMax(未定义)。
2. 初始化错误:sufMAX = -n, sufMin = n,用n的相反数和n本身作为极值初始化不合理,应用整型极值(如INT_MIN/INT_MAX)。
3. 更新逻辑错误:第6行sufMin = max(A[i], sufMin)应为sufMin = min(A[i], sufMin),否则无法正确维护最小值。
4. 计算逻辑不完整:第7行直接取max(A[i] * sufMax, A[i] * sufMin),未考虑A[i]正负性对选择乘数的影响(虽然数学上等价,...
登录后发布评论
暂无评论,来抢沙发