4. Median of Two Sorted Arrays
----------------------------------------------------------------------------
Mean:
给定两个数组,求这两个数组的中位数.(要求时间复杂度为O(log(n+m))
analyse:
一开始用归并为一个数组的方法做了一下也AC了,看来lc的时间还是给的很宽的.
将本题转化为求第k大数就简单多了,其中求第k大数使用类似二分的方法来实现,从而将时间复杂度降到O(log(n+m)).
Time complexity: O(log(n+m)
view code
/** * ----------------------------------------------------------------- * Copyright (c) 2016 crazyacking.All rights reserved. * ----------------------------------------------------------------- * Author: crazyacking * Date : 2016-02-03-12.07 */ #include <queue> #include <cstdio> #include <set> #include <string> #include <stack> #include <cmath> #include <climits> #include <map> #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std; typedef long long( LL); typedef unsigned long long( ULL); const double eps( 1e-8); /*Solution 1*/ class Solution { //求A和B数组的第k大数 int getMedian( int A [], int m , int B [], int n , int k) { if( m >n) return getMedian(B ,n , A , m , k); //默认A为短数组 if( m == 0) return B [ k - 1 ]; if( k == 1) return min( A [ 0 ], B [ 0 ]); int pa = min( k / 2 , m); int pb = k - pa; if( A [ pa - 1 ] < B [pb - 1 ]) { return getMedian( A + pa , m - pa , B , n , k - pa); } else if( A [ pa - 1 ] > B [pb - 1 ]) { return getMedian( A , m , B +pb , n -pb , k -pb); } else { return A [ pa - 1 ]; } return 0; } public : double work( int A [], int m , int B [], int n) { if(( m +n) % 2 == 0) { return ( getMedian( A , m ,B , n , ( m +n) / 2) + getMedian( A , m ,B , n , ( m +n) / 2 + 1)) / 2.; } else { return getMedian( A , m ,B , n , ( m +n) / 2 + 1); } } double findMedianSortedArrays( vector < int >& nums1 , vector < int >& nums2) { int A [ 10000 ],B [ 10000 ]; int idx = 0; for( auto p: nums1) { A [ idx ++ ] =p; } idx = 0; for( auto p: nums2) { B [ idx ++ ] =p; } int m = nums1 . size(); int n = nums2 . size(); double ret = work( A , m ,B ,n); return ret; } }; /*Solution 2*/ /* class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { auto it1=nums1.begin(); auto it2=nums2.begin(); vector<int> a; while(it1!=nums1.end() || it2!=nums2.end()) { if(it1==nums1.end() && it2!=nums2.end()) { a.push_back((*it2)); it2++; } else if(it1!=nums1.end() && it2==nums2.end()) { a.push_back(*it1); it1++; } else if(it1!=nums1.end() && it2!=nums2.end()) { if((*it1)<(*it2)) { a.push_back(*it1); it1++; } else { a.push_back(*it2); it2++; } } } int len=a.size(); double ans=(len%2)?(double)a[len/2]:(double)(a[len/2-1]+a[len/2])/2.; return ans; } }; */ int main() { int n , m , temp; while( cin >>n >> m) { vector < int > a ,b; for( int i = 0; i <n; ++ i) { cin >> temp; a . push_back( temp); } for( int i = 0; i < m; ++ i) { cin >> temp; b . push_back( temp); } Solution solution; double ans = solution . findMedianSortedArrays( a ,b); cout << "===========ans===========" << endl; cout << ans << endl; } return 0; }