没有用时间O(n)的遍历,直接用O(lgn)的二分查找,不过辅助空间大了一倍。
对二分时的左右端处理(还有循环判断)想了很久,之前没有对m1+m2作判断,导致划分不均匀,结果一直错。
关键在于保证,m1和m2对两条序列的划分能一直保持平分。
#include <stdio.h>
#define debug printf
int n;
int s1[100000], s2[100000];
int main()
{
freopen("in.txt", "r", stdin);
scanf("%d", &n);
int i;
for(i=0; i<n; i++)
scanf("%d", s1+i);
for(i=0; i<n; i++)
scanf("%d", s2+i);
int l1=0, l2=0, r1=n-1, r2=n-1, m1, m2;
while((r1-l1)>=0 && (r2-l2)>=0){
m1 = (l1+r1)/2;
m2 = (l2+r2)/2;
if(s1[m1] == s2[m2]){
printf("%d", s1[m1]);
return 0;
}
else if(s1[m1] > s2[m2]){
if(m1+m2 == n-1){
r1 = m1-1;
l2 = m2;
}
else{
r1 = m1;
l2 = m2+1;
}
}
else {
if(m1+m2 == n-1){
l1 = m1;
r2 = m2-1;
}
else{
l1 = m1+1;
r2 = m2;
}
}
debug("%d %d %d - %d %d %d\n", l1, r1, m1, l2, r2, m2);
}
if(l1 == r1) printf("%d", s1[l1]);
else printf("%d", s2[l2]);
return 0;
}
最后输出哪一个的判断也很重要,需要考虑循环跳出后的所有情况(必定有一个左端记录超过了右端)。
补:现在发现数据输入就要O(n)时间了,O_T...