solution:
这个题目想一口气写好不容易。 需要考虑的细节很多。算法倒是很好理解。既然是sorted array, 那么必须用好排好的序。所以要追求 O(ln n).
代码:
- class Solution {
- public:
- double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
- double res;
- int l1=nums1.size();
- int l2=nums2.size();
- int total = l1 + l2;
- if(total & 0x1){ // total is odd;
- res = findKth(nums1, 0, l1, nums2, 0, l2, total/2 + 1)*1.0;
- }
- else {
- res = (findKth(nums1, 0, l1, nums2, 0, l2, total/2)
- + findKth(nums1, 0, l1, nums2, 0, l2, total/2 + 1))/2.0;
- }
- return res;
- }
- private:
- int findKth(vector<int>& v1, int a1, int b1, vector<int>& v2, int a2, int b2, int k){
- int x1=b1-a1;
- int x2=b2-a2;
- if(x1>x2) return findKth(v2, a2, b2, v1, a1, b1, k);
- if(x1==0) return v2[a2+k-1];
- if(k==1) return min(v1[a1], v2[a2]);
- int m=min(x1, k/2);
- int n=k-m;
- if(v1[a1+m-1]<v2[a2+n-1]){
- return findKth(v1, a1+m, b1, v2, a2, b2, k-m);
- }
- else if(v1[a1+m-1]>v2[a2+n-1]){
- return findKth(v1, a1, b1, v2, a2+n, b2, k-n);
- }
- else {
- return v1[a1+m-1];
- }
- }
- };