#include <stdio.h>
int mid(int a[], int b[], int m, int n) {
int i = 0, j = 0, min = 0, pre;
for(int k = 0; k <= (m + n - 2) / 2; k++) {
if(a[i] >= b[j]) {
pre = b[j];//关键,记录上一个元素的值,思想来自折半查找
if(j<n) j++;//条件自增
//pre = b[j++];到达数组边界,数组自增导致溢出
}
else {
pre = a[i++];
if(i<m) i++;
}
}
if(a[i] >= b[j])
min=b[j];
else
min = a[i];
if ((m + n) % 2 == 1)
return min;
else
return (min + pre) / 2;
}
int main()
{
int a[] = {0,1,2,3,4,5};
int b[] = {0,1,2};
int m = 6;
int n = 3;
int k = mid(a,b,m,n);
printf("%d",k);
return 0;
}
chatgpt简洁版
#include <stdio.h>
int mid(int a[], int b[], int m, int n) {
int i = 0, j = 0, min = 0, pre;
for (int k = 0; k <= (m + n - 1) / 2; k++) {
pre = min;//每次循环开头初始化pre
if (i < m && (j >= n || a[i] <= b[j])) {
min = a[i++];
} else {
min = b[j++];
}
}
if ((m + n) % 2 == 1)
return min;
else
return (min + pre) / 2;
}
int main()
{
int a[] = {0,1,2,3,4,5};
int b[] = {1,1,1};
int m = 6;
int n = 3;
int k = mid(a,b,m,n);
printf("%d",k);
return 0;
}