# 【LeetCode】 4. Median of Two Sorted Arrays ## Description > 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. > 有兩個已經排序好的陣列num1和num2,且大小分別是m和n。 > 請找出這兩個陣列合併後的中位數,時間複雜度應為O(log(m+n))。 > 你可以假設陣列不會是空的。 ## Example: ``` 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 ``` ## Solution * `num1[i]`和`num2[j]`比較,比較小的那個數,最大情況只可能是第`i+j-1`大。(可能要思考一下) * 因此我們要找第`k`個數字,我們讓`i`和`j`不超過`k/2`,每次刪去`i`或`j`的可能,讓`k`不斷變小,直到`k=1`,得到答案。 * 建議可以拿測資,照著下方程式碼畫圖跑一次,幫助理解。 * 轉換為指標可以更快。 ### Code ```C++=1 class Solution { public: int min(int a,int b) { return a<b?a:b; } int getkth(int *arr_s,int size_s,int *arr_l,int size_l,int k) { if(size_s>size_l) { return getkth(arr_l,size_l,arr_s,size_s,k); } if(size_s==0) { return arr_l[k-1]; } if(k==1) { return min(arr_s[0],arr_l[0]); } int i=min(size_s,k/2); int j=min(size_l,k/2); if(arr_s[i-1]>arr_l[j-1]) { return getkth(arr_s,size_s,arr_l+j,size_l-j,k-j); } else { return getkth(arr_s+i,size_s-i,arr_l,size_l,k-i); } } double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int* a = nums1.data(); int* b = nums2.data(); int size_a=nums1.size(); int size_b=nums2.size(); int l = (size_a + size_b+1) /2.0; int r = (size_a + size_b+2) /2.0; return (getkth(a,size_a ,b,size_b, l) + getkth(a,size_a, b,size_b, r)) / 2.0; } }; ``` ###### tags: `LeetCode` `C++`