文章

281

粉丝

40

获赞

2

访问

23.8k

头像
2025年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年9月23日 21:02
阅读数 113

void CallMulMax(int A[], int res[],int n){
if(n == 0)return;

int max_val = A[n-1];
int imax_val = A[n-1];
res[n-1] = A[n-1]*A[n-1];

for(int i = n-2; i >= 0; i--){

if(A[i] > 0){
if(A[i] > max_val)max_val = A[i];
res[i] = A[i]*max_val;
}

if(A[i] < 0){
if(abs(A[i]) > abs(imax_val))imax_val = A[i];
res[i] = A[i]*imax_val;
}

if(A[i] == 0)res[i] = 0;

}

}

时间复杂度是O(n),空间复杂度是O(1)

算法思想:
因为题设要求的是求从A[i]与直到A[n-1]的数相乘所得的最大值,所以我们从右往左遍历
因为负数只有乘以负数才能是正数才能是最大值,如果后续都没有负数,那么乘积的最大值就是本身的平方
正数和后续数字相乘最大数一定是正数乘以正数得到的
所以我们只需要维护从A[i]到后续直至A[n-1]得到的正数最大值max_val和负数最小值imax_val
当A[i]是大于0的,那么res[i]的最大值 = A[i]乘以max_val
当A[i]是小于0的,那么res[i]的最大值 = A[i]乘以imax_val
当A[i]是等于0的,那么res[i]乘以任何数的结果都是0

 


评分及理由

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

得分:2分
理由:学生理解了需要从右向左遍历的基本方向,并尝试通过维护最大值和最小值来处理正负数情况。但算法思想存在严重缺陷:
1) 当A[i]为正数时,只考虑与后续最大正数相乘,忽略了如果后续存在更大的负数乘积可能(如A[i]为正但后续有更大的负负得正情况)
2) 当A[i]为负数时,错误地使用绝对值比较来选择imax_val,这会导致选择错误的负数(应该选择最小的负数而不是绝对值最大的负数)
3) 没有考虑A[i]本身可能是最大值的情况
基本思路方向正确但...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发