标签:
题目描述:
给定两个有序数组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。
要求:时间复杂度O(logN)
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 }
标签:
原文地址:http://www.cnblogs.com/qianmacao/p/4884795.html