1. 程式人生 > >【LeetCode & 劍指offer刷題】查詢與排序題4:Median of Two Sorted Arrays

【LeetCode & 劍指offer刷題】查詢與排序題4:Median of Two Sorted Arrays

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

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)).
Example 1: nums1 = [1, 3] nums2 = [2]   The median is 2.0 Example 2: nums1 = [1, 2] nums2 = [3, 4]   The median is (2 + 3)/2 = 2.5

C++   //方法一:合併,然後計算中值 //不過時間複雜度為O(m+n),不滿足題意 class Solution { public :     double findMedianSortedArrays
( vector < int >& nums1 , vector < int >& nums2 )     {         int i = 0 , j = 0 , k = 0 ;         int m = nums1 . size ();         int n = nums2 . size ();         int len = m + n ;         vector < int > temp ( len );         while ( i < m && j < n ) //合併,耗時O(m+n)         {             temp [ k ++] = ( nums1 [ i ]< nums2 [ j ])? nums1 [ i ++]: nums2 [ j ++];         }         while ( i < m )         {             temp [ k ++] = nums1 [ i ++];         }         while ( j < n )         {             temp [ k ++] = nums2 [ j ++];         }                double mid ; //注意這裡型別為浮點數,因為可能為小數         if ( len & 1 )             mid = temp [( len - 1 )/ 2 ]; //長度為奇數時,中值為中間數         else             mid = ( temp [( len - 1 )/ 2 ]+ temp [ len / 2 ])/ 2.0 ; //長度為偶數時,中值為中間兩數平均數         return mid ;                   } };   //方法二:遞迴,利用二分查詢 //沒看懂?? class Solution { public :     int getkth ( vector < int >& s , int m , vector < int >& l , int n , int k )     {         //讓m<=n         if ( m > n ) return getkth ( l , n , s , m , k );         if ( m == 0 ) return l [ k - 1 ];         if ( k == 1 ) return min ( s [ 0 ], l [ 0 ]);                 int i = min ( m , k / 2 ), j = min ( n , k / 2 );         if ( s [ i - 1 ] > l [ j - 1 ]) return getkth ( s , m ,, n - j , k - j );         else return getkth ( s + i , m - i , l , n , k - i );         return 0 ;     }             double findMedianSortedArrays ( vector < int >& a , vector < int >& b )     {         int m = a . size ();         int n = b . size ();         int l = ( m + n + 1 ) >> 1 ;         int r = ( m + n + 2 ) >> 1 ;         return ( getkth ( a , m , b , n , l ) + getkth ( a , m , b , n , r ))/ 2.0 ;                    } };