一起刷LeetCode4-Median of Two Sorted Arrays

  实验室太吵了。。。怎么办啊。。。

--------------------------------------------------------------------------------------------------------------------

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] 任意的一个元素

(其实这个想法,和我之前想到的那个还是蛮相似的。。。)。用递归很好实现,代码是学习别人的,感觉写的很好,比自己的写的好。

学习了,感觉自己代码实现能力还是不太好,要加强。

-----------------------------------------------------------------------------------------------------------------------------------

代码如下:

 1 double f(int * nums1,int m,int *nums2,int n,int k) {
 2     if(m > n) {
 3         return f(nums2,n,nums1,m,k);
 4     }
 5     if(m == 0) {
 6         return nums2[k - 1];
 7     }
 8     if(k == 1) {
 9         if(nums1[0] < nums2[0]) {
10             return nums1[0];
11         }else {
12             return nums2[0];
13         }
14     }
15     int pa,pb;
16     if(k/2 < m) {
17         pa = k/2;
18         pb = k - pa;
19     }else {
20         pa = m;
21         pb = k -pa;
22     }
23     if(nums1[pa - 1] < nums2[pb - 1]) {
24         return f(nums1 + pa,m - pa,nums2 , n, k - pa);
25     }else if(nums1[pa - 1] > nums2[pb - 1]) {
26         return f(nums1 ,m ,nums2 + pb, n - pb, k - pb);
27     }else {
28         return nums1[pa - 1];
29     }
30 }
31 
32 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
33    
34     int total = nums1Size + nums2Size;
35     if(total % 2 == 0){
36         return ( f(nums1,nums1Size,nums2,nums2Size,total/2) + f(nums1,nums1Size,nums2,nums2Size,total/2 + 1) ) / 2; 
37     }else {
38         return f(nums1,nums1Size,nums2,nums2Size,total/2 + 1);
39     }
40 }

 

posted @ 2015-05-11 22:53  LeeZz  阅读(185)  评论(0编辑  收藏  举报