两个有序序列的中位数

找好你自己的位置!

思路写在了纸上,我太懒了,不想打一遍,直接贴图。


老师给的题中的数据还要多做个处理就是在每一个数组最后再多加一个元素(数值为A[n-1]+1),这样才能保证该function的正常使用。


直接贴代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
#include<stdlib.h>

int A[2500001],B[2500001];

int median(int A[],int B[],int a,int b,int L,int R)
{
int c,p;
c=(a+b-1)/2;
p=(L+R)/2;
if(L>R)
return median(B,A,b,a,0,b-1);
else if(A[p]>=B[c-p-1]&&A[p]<=B[c-p])
return A[p];
else if(A[p]<B[c-p-1])
return median(A,B,a,b,p+1,R);
else
return median(A,B,a,b,L,p-1);
}

int main()
{
int a,b,i;
scanf("%d",&a);
for(i=0;i<a;++i)
scanf("%d",&A[i]);
scanf("%d",&b);
for(i=0;i<b;++i)
scanf("%d",&B[i]);
//多做的处理
A[a]=A[a-1]+1;
B[b]=B[b-1]+1;
printf("%d\n",median(A,B,a,b,0,a-1));
return 0;
}

leetcode 题

优秀题解,多解法

优秀题解,边界处理相当好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size();
int n=nums2.size();
if(m>n)
return findMedianSortedArrays(nums2,nums1);
int iMin=0,iMax=m;
while(iMin<=iMax)
{
int i=(iMin+iMax)/2;
int j=(m+n+1)/2-i;
if(j!=0&&i!=m&&nums2[j-1]>nums1[i])
iMin=i+1;
else if(i!=0&&j!=n&&nums1[i-1]>nums2[j])
iMax=i-1;
else
{
int midLeft=0;
if(!i) midLeft=nums2[j-1];
else if(!j) midLeft=nums1[i-1];
else midLeft=max(nums1[i-1],nums2[j-1]);
if((m+n)%2) return midLeft;

int midRight=0;
if(i==m) midRight=nums2[j];
else if(j==n) midRight=nums1[i];
else midRight=min(nums1[i],nums2[j]);

return (midLeft+midRight)*1.0/2.0;
}
}
return 0.0;
}
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!