文章
35
粉丝
0
获赞
0
访问
1.2k
1.基本思想:对A和B序列采用归并的思想,但是不把他们归并到新的空间数组中,而是用一个计数器count,两个数组元素比较一次,count加1,当比较次数为L时,即得到的是A和B序列的中位数,输出这个值即可
2.代码如下
int findMidOfAAndB(int A[],int B[],int L){
int count = 0;//归并计数器
int temp = 0;//暂存当前值
int a=0;int b=0;//数组A和B的指针
while(a<L&&b<L){
if(A[a]<B[b]){
temp = A[a];
a++;
}else{
temp = B[b];
b++;
}
count++;
if(count = L){
break;
}
}
return temp;
}
3.时间复杂度为O(n),空间复杂度为O(1)
评分及理由
(1)得分及理由(满分4分)
得分:2分
理由:学生采用了归并思想,通过计数器找到第L个元素作为中位数。这种方法能够正确找到两个升序序列的中位数,思路基本正确。但与标准答案的高效二分法相比,时间复杂度为O(n)而非最优的O(log n),因此不能给满分。考虑到思路可行且能解决问题,给予2分。
(2)得分及理由(满分9分)
得分:6分
理由:代码实现了归并思路,逻辑基本正确。但存在以下问题:
1. 代码中`if(count = L)`应为`if(count == L)`,这是赋值运算符误写为比较运算符的逻辑错误
2. 当a或b指针先到达L时,循环会提前结束,可能无法正确找到第L个元素
3. 缺少对边界情况的完整处理
由于核心逻辑正确但存在实现缺陷,扣除3分。
(3)得分及理由(满分2分)
得分:2分
理由:正确分析了时间复杂度O(n)和空间复杂度O(1),与算法实现相符,给满分。
题目总分:2+6+2=10分
登录后发布评论
暂无评论,来抢沙发