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)).spa
You may assume nums1 and nums2 cannot be both empty.code
Example 1:blog
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
class Solution { public: /* 對於一個長度爲n的已排序數列a,若n爲奇數,中位數爲第(n/2+1)個數 , 若n爲偶數,則中位數=[第(n/2)個數 + 第(n/2+1)個數] / 2 若是咱們能夠在兩個數列中求出第K小的元素,即可以解決該問題 不妨設數列A元素個數爲n,數列B元素個數爲m,各自升序排序,求第k小元素 取A[k / 2] B[k / 2] 比較, 若是 A[k / 2] > B[k / 2] 那麼,所求的元素必然不在B的前k / 2個元素中(證實反證法) 反之,必然不在A的前k / 2個元素中,因而咱們能夠將A或B數列的前k / 2元素刪去,求剩下兩個數列的 k - k / 2小元素,因而獲得了數據規模變小的同類問題,遞歸解決 若是 k / 2 大於某數列個數,所求元素必然不在另外一數列的前k / 2個元素中,同上操做就好。 */ double findKth(vector<int>& A, vector<int>& B, int A_st, int B_st, int k) { //經典函數 // 邊界狀況,任一數列爲空 if (A_st >= A.size()) { return B[B_st + k - 1]; } if (B_st >= B.size()) { return A[A_st + k - 1]; } // k等於1時表示取最小值,直接返回min if (k == 1) return min(A[A_st], B[B_st]); int A_key = A_st + k / 2 - 1 >= A.size() ? INT_MAX : A[A_st + k / 2 - 1]; int B_key = B_st + k / 2 - 1 >= B.size() ? INT_MAX : B[B_st + k / 2 - 1]; if (A_key < B_key){ return findKth(A, B, A_st + k / 2, B_st, k - k / 2); } else { return findKth(A, B, A_st, B_st + k / 2, k - k / 2); } } double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int sum = nums1.size() + nums2.size(); double ret; if (sum & 1) { ret = findKth(nums1, nums2, 0, 0, sum / 2 + 1); } else { ret = ((findKth(nums1, nums2, 0, 0, sum / 2)) + findKth(nums1, nums2, 0, 0, sum / 2 + 1)) / 2.0; } return ret; } };