Median of Two Sorted Arrays(兩個有序陣列的中位數)
阿新 • • 發佈:2019-01-31
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))
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中最小的元素,若為順序的話,則為序列1和序列2的首元素,比較兩個元素的大小,若A1[0] > A2[0],則A2[0]為最小的元素,
再比較A1[0] 和A2[1],較小的元素為第二小的元素,反之,A1[0]為最小元素,再比較A1[1] 和 A2[0],較小的為第二小的元素。
依次類推,遍歷兩個陣列的所有元素。
所需的時間複雜度為O(log (m+n)),其中m和n為兩個陣列的各自大小。
基於上述原理,判斷m+n是偶數還是奇數,若為偶數,
則中位數為第(m+n)/2 和 (m+n)/2 + 1大的元素的平均值
若為奇數,則中位數為(m+n)/2 + 1大的元素的值。
程式碼如下(不知道怎麼寫整潔一點。。。):
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n = nums1.size(); int m = nums2.size(); int i = 0,j = 0; int s = m + n; double odd; if(s%2 == 0){ odd = 0; } else odd = 1; s /= 2; int count = 0; int num1,num2; while(i < n && j < m) { count ++; if(nums1[i] > nums2[j]) { if(count == s) { num1 = nums2[j]; } else if(count == s+1) { num2 = nums2[j]; } ++j; } else { if(count == s) { num1 = nums1[i]; } else if(count == s+1) { num2 = nums1[i]; } ++i; } } if(i == n) { if(s + 1 > count){ num2 = nums2[j + s - count]; } if(s > count) { num1 = nums2[j + s - count - 1]; } } else if(j == m) { if(s + 1 > count){ num2 = nums1[i + s - count]; } if(s > count) { num1 = nums1[i + s - count - 1]; } } if (odd){ return num2; } else return (num1+num2)/2.0; } };