时间和空间复杂度最少的求两个升序数组的中位数
题目描述: 一个长度为L的升序S,处在L/2向下取整处的位置的数称为S的中位数。 现求两个等长的两个升序序列A和B的中位数。 分析:当然这题如果不要求最高效的话,可以完全重新开辟一个2倍长度的数组C,然后将A,B数组合并到C中,然后得其(L/2 - 1)处的值,即可。但空间复杂度较高为O(n),并且合并的时间复杂也为O(n),所以自己又进一步改进了一下,将空间复杂度降到了O(1),但时间复杂度依旧是O(n).下面给出代码: #include<stdio.h> int M_serach(int s1[],int s2[]){ int mid=0; int len = 5; int i=0,j=0; while(i<len&&j<len){//其实就是模拟合并的过程只是不需要将其装入C数组中了 if(s1[i]>s2[j]) { j++; mid++; if(mid == len-1) printf("%d\n",s1[i]); }else{ i++; mid++; if(mid == len-1) { printf("%d\n",s2[j]); } } } } //为了方便,我就任意取了几组测试数据 int s1[] = {1,3,5,7,9}; int s2[] = {2,4,6,8,20}; int main(){ M_serach(s1,s2); return 0; }