[nowCoder] 两个长度相同有序数组的中位数
给定两个有序数组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 4
1‘ 2’ 3‘ 4’
若2 == 2‘ ,则直接返回;
若2 > 2', 说明 2 至少排第4, 所以3,4可以排除,1’ 2‘(2’ 最多排第3)可以排除,所以对剩下的1 2和3‘ 4’ 递归
若2 < 2‘,同理递归1’ 2‘和3、4.
假设两个数组长度为奇数
1 2 3 4 5
1‘ 2’ 3‘ 4’ 5’
若3 == 3‘ ,则直接返回;
若3 > 3', 说明 3 至少排第6, 所以4,5可以排除,1’ 2‘(2’ 最多排第4)可以排除,所以对剩下的1 2 3和 3‘ 4’ 5‘递归,其实3也能排除,但是为了保证两个数组的长度一样,保留3
若3 < 3‘,同理递归1’ 2‘ 3’和3、4 、5.
http://www.nowcoder.com/profile/864393/test/231563/24589
class Solution { public: int getUpMedian(vector<int> arr1, vector<int> arr2) { if(arr1.size() != arr2.size()) return -1; if(arr1.size() == 0) return -1; return getUpMedian(arr1, 0, arr1.size() -1, arr2, 0, arr1.size() -1 ); } int getUpMedian(const vector<int> & arr1, int start1, int end1, const vector<int> & arr2, int start2, int end2) { //cout << "start1\t" << start1 << endl; //cout << "end1\t" << end1 << endl; //cout << "start2\t" << start2 << endl; //cout << "end2\t" << end2 << endl; if(start1 == end1) { return min(arr1[start1], arr2[start2]); } int size = end1 - start1 + 1; int halfSize; if(size & 0x1 == 0x1) { halfSize = (size + 1)/2; } else { halfSize = size/2; } if(arr1[start1 + halfSize - 1] == arr2[start2 + halfSize - 1]) return arr1[start1 + halfSize - 1]; else if(arr1[start1 + halfSize - 1] > arr2[start2 + halfSize - 1]) return getUpMedian(arr1, start1, start1 + halfSize - 1, arr2, end2-(halfSize-1), end2); else //if(arr1[start1 + halfSize - 1] > arr2[start2 + halfSize - 1]) return getUpMedian(arr1, end1-(halfSize-1) , end1, arr2, start2, start2 + halfSize -1); } };