实验室太吵了。。。怎么办啊。。。
--------------------------------------------------------------------------------------------------------------------
Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays.
The overall run time complexity should be O(log (m+n)).
【题意】:给你两个已经排好序的数组,求中位数,要求时间复杂度为:O(log(m+n))。
【心路历程】:看完这道题直接的想法就是用merge 的方法对两个数组合并排序,但是时间复杂度为:O((m+n))。
因为要求的时间复杂度为O(log(m+n)),所以很自然会想去用二分求解。于是,我最开始的思路是分别对两个数组进行二分,
然后进行比较,如果A > B,则去掉B的小于N/2的部分,去掉A的大于M/2的部分。如果A < B,则去掉A的小于M/2的部分,
去掉B的大于M/2的部分。如果 A = B ,则返回中间值。后来发现这个方法有很多不妥之处,自己实现时也是感觉有问题。
于是又开始想,发现自己确实没啥思路,就无耻的度娘了一下,发现这题可以转化成求最K值问题。原来在《剑指OFFER》上看过
最k值问题,但是却忘得一干二净了。。。
这题就是最K值问题,两个数组分别取第K/2个元素进行比较。如果A[K/2] < B[K/2] ,则忽略掉A[k/2]之前的所有元素;同理如果
A[K/2] > B[K/2] ,则忽略掉B[K/2]之前的所有元素;如果A[K/2] == B[K/2] ,则返回A[K/2] 或 B[K/2] 任意的一个元素
(其实这个想法,和我之前想到的那个还是蛮相似的。。。)。用递归很好实现,代码是学习别人的,感觉写的很好,比自己的写的好。
学习了,感觉自己代码实现能力还是不太好,要加强。
-----------------------------------------------------------------------------------------------------------------------------------
代码如下:
double f(int * nums1,int m,int *nums2,int n,int k) {
if(m > n) {
return f(nums2,n,nums1,m,k);
}
if(m == ) {
return nums2[k - ];
}
if(k == ) {
if(nums1[] < nums2[]) {
return nums1[];
}else {
return nums2[];
}
}
int pa,pb;
if(k/ < m) {
pa = k/;
pb = k - pa;
}else {
pa = m;
pb = k -pa;
}
if(nums1[pa - ] < nums2[pb - ]) {
return f(nums1 + pa,m - pa,nums2 , n, k - pa);
}else if(nums1[pa - ] > nums2[pb - ]) {
return f(nums1 ,m ,nums2 + pb, n - pb, k - pb);
}else {
return nums1[pa - ];
}
} double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) { int total = nums1Size + nums2Size;
if(total % == ){
return ( f(nums1,nums1Size,nums2,nums2Size,total/) + f(nums1,nums1Size,nums2,nums2Size,total/ + ) ) / ;
}else {
return f(nums1,nums1Size,nums2,nums2Size,total/ + );
}
}