以一题多解为荣,以做出来就行为耻。
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)).
You may assume nums1 and nums2 cannot be both empty.
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
递归写法:
采用分治的思想来解决这个问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(); int n = nums2.size(); return ((double)(findKth(nums1, 0, nums2, 0, (m+n+1)/2)) + (double)(findKth(nums1, 0, nums2, 0, (m+n+2)/2))) / 2.0; } private: int findKth(vector<int>& nums1, int i, vector<int>& nums2, int j, int k) { if(i >= nums1.size()) return nums2[j+k-1]; if(j >= nums2.size()) return nums1[i+k-1]; if(k == 1) return min(nums1[i], nums2[j]); int mid1 = (i+k/2-1<nums1.size()) ? nums1[i+k/2-1] : INT_MAX; int mid2 = (j+k/2-1<nums2.size()) ? nums2[j+k/2-1] : INT_MAX; if(mid1 < mid2) return findKth(nums1, i+k/2, nums2, j, k-k/2); else return findKth(nums1, i, nums2, j+k/2, k-k/2); } };
|
递推写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n1 = nums1.size(); int n2 = nums2.size(); if(n1 > n2) return findMedianSortedArrays(nums2, nums1); if(n1 == 0) return (nums2[(n2-1)/2] + nums2[n2/2]) / 2.0;//若n2为偶数,(n2-1)/2为中间偏左,n2/2为中间偏右;若n2位奇数,则(n2-1)/2==n2/2 int size = n1 + n2; int cutL = 0, cutR = n1; while(cutL <= cutR) { int m1 = cutL + (cutR-cutL)/2; int m2 = size/2 - m1; double L1 = (m1==0) ? INT_MIN : nums1[m1-1]; double L2 = (m2==0) ? INT_MIN : nums2[m2-1]; double R1 = (m1==n1) ? INT_MAX : nums1[m1]; double R2 = (m2==n2) ? INT_MAX : nums2[m2]; if(L1 > R2) cutR = m1 - 1; else if(L2 > R1) cutL = m1 + 1; else{ if(size % 2 == 0){ L1 = (L1 > L2 ? L1 : L2); R1 = (R1 < R2 ? R1 : R2); return (L1+R1) / 2.0; }else return (R1 < R2 ? R1 : R2); } } return -1; } };
|