題目描述:ios
給定兩個有序數組arr1和arr2,兩個數組長度都爲N,求兩個數組中全部數的上中位數。
例如:
arr1 = {1,2,3,4};
arr2 = {3,4,5,6};
一共8個數則上中位數是第4個數,因此返回3。數組
arr1 = {0,1,2};
arr2 = {3,4,5};
一共6個數則上中位數是第3個數,因此返回2。spa
要求:時間複雜度O(logN)code
1 /* 2 思路: 二分思路 3 首先分別找出兩個數組arr1和arr2的中位數,分別爲mid1,mid2,比較, 4 1) 若是mid1 == mid2,則該數即爲全部數的上中位數。 5 2) mid1 > mid2時: 6 若數組長度N爲偶數時: 7 由於mid1>mid2,因此mid2不多是全部數的上中位數,arr1中mid1後面的數也不多是上中位數, 8 此時兩個數組就分別篩選掉了一半,而後遞歸對arr1的前半部分和arr2的後半部分求全部數的上中位數。 9 若數組長度N爲奇數時: 10 由於mid1>mid2,因此mid1不多是全部數的上中位數,但mid2有多是,因爲球上中位數的兩個數組 11 必須等長,所以,咱們遞歸對arr1的前半部分(包括mid1)和arr2的後半部分(包括mid2)求全部數的上中位數。 12 3) mid1 < mid2時的狀況和 2)相似。 13 */ 14 #include <iostream> 15 #include <vector> 16 using namespace std; 17 18 int findProcess(vector<int> arr1, int l1, int r1, vector<int> arr2, int l2, int r2){ 19 if (l1 == r1) 20 return (arr1[l1] < arr2[l2] ? arr1[l1] : arr2[l2]); 21 // 元素個數爲奇數,則offset=0;不然offset=1. 22 int offset = ((r1-l1+1)&1) ^ 1; 23 int mid1 = (l1+r1)/2; 24 int mid2 = (l2+r2)/2; 25 if (arr1[mid1] > arr2[mid2]) 26 return findProcess(arr1, l1, mid1, arr2, mid2+offset, r2); 27 else if(arr1[mid1] < arr2[mid2]) 28 return findProcess(arr1, mid1+offset, r1, arr2, l2, mid2); 29 else 30 return arr1[mid1]; 31 } 32 33 int getUpMedian(vector<int> arr1, vector<int> arr2){ 34 if (arr1.size() == 0 || arr2.size() == 0 || arr1.size() != arr2.size()) 35 return -1; 36 return findProcess(arr1, 0, arr1.size()-1, arr2, 0, arr2.size()-1); 37 } 38 39 int main(){ 40 vector<int> a1; 41 a1.push_back(1); 42 a1.push_back(2); 43 a1.push_back(3); 44 a1.push_back(4); 45 46 vector<int> a2; 47 a2.push_back(3); 48 a2.push_back(4); 49 a2.push_back(5); 50 a2.push_back(6); 51 cout << getUpMedian(a1,a2) << endl; 52 return 0; 53 }