Median of Two Sorted Arrays-分治法

題目意思很簡單將兩個有序數組合並之後的中位數找出來。題目要求使用log(m+n)的時間複雜度來做。

雖然言簡意賅,但不得不承認這個題目我自己想了好久也沒做出來,隱約覺得應該使用尋找第k大數的算法來做,但是具體到這個題目,編碼多次都以失敗告終,所以不得不去網上參考下別人的思路和代碼。

參考鏈接:http://blog.csdn.net/zxzxy1988/article/details/8587244

但是這個方法現在已經無法在leetcode上AC,需要在兩個遞歸的return處進行修改。

思路是這樣的:

我們尋找兩個數組的第k個數,那麼我們首先找到兩個數組中的第(k/2-1)個數。比較兩個數組中這個數的大小來進行不同遞歸。

 

代碼如下:

 1     int min(int a,int b)
 2     {
 3         return a>b?b:a;
 4     }
 5     double findknumber(int *a,int *b,int al,int bl,int k)
 6     {
 7         if (al > bl)
 8             return findknumber(b, a, bl, al, k);
 9         if (al == 0)
10             return b[k - 1];
11         if (k == 1)
12             return min(a[0], b[0]);
13         int aindex = min(k / 2, al);
14         int bindex = k - aindex;
15         if (a[aindex - 1] < b[bindex - 1])
16             return findknumber(a + aindex, b, al - aindex, bindex, k - aindex);
17         else if (a[aindex - 1] > b[bindex - 1])
18             return findknumber(a, b + bindex, aindex, bl - bindex, k - bindex);
19         else
20             return a[aindex - 1];
21 
22 
23     }
24     double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
25         int total=nums1Size+nums2Size;
26         if(total%2==1)
27             return findknumber(nums1,nums2,nums1Size,nums2Size,total/2+1);
28         else
29             return (findknumber(nums1,nums2,nums1Size,nums2Size,total/2+1)
30                     +findknumber(nums1,nums2,nums1Size,nums2Size,total/2))/2.0;
31 
32     }

這個代碼還存在兩個問題,後續我再補充:

存在一個找第k個數的座標問題;

這個算法的真實時間複雜度如何;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章