LeetCode 4. Median of Two Sorted Arrays (分治)

两个有序的数组 nums1 和 nums2 维数分别为m,n。找所有数的中位数,复杂度 O(log (m+n))

注意:奇偶个数,分治法求解,递归出口特殊处理。取Kth smallest数时,分治取mid=k/2和k-mid,避免奇数造成影响。

 1 class Solution {
 2     double findKth(vector<int> num1,vector<int> num2, int k)
 3     {
 4         int m = num1.size(), n = num2.size();
 5         if(m > n)
 6             return findKth(num2,num1,k);
 7         if(m == 0)
 8             return num2[k-1];
 9         if(k == 1)
10             return num1[0]>num2[0]?num2[0]:num1[0];
11         int mid1=min(k/2,m), mid2=k-mid1;
12         if(num1[mid1-1]>num2[mid2-1])
13             return findKth(num1,vector<int>(num2.begin()+mid2,num2.end()),k-mid2);
14         else if(num1[mid1-1]<num2[mid2-1])
15             return findKth(vector<int>(num1.begin()+mid1,num1.end()),num2,k-mid1);
16         else
17             return num1[mid1-1];
18 
19     }
20 
21 public:
22     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
23         int m = nums1.size(), n = nums2.size();
24         return (findKth(nums1, nums2, (m + n + 1) / 2) + findKth(nums1, nums2, (m + n + 2) / 2)) / 2.0;
25     }
26 };

 

posted @ 2017-10-09 18:27  demianzhang  阅读(229)  评论(0编辑  收藏  举报