3-4-多數組中位數

題目描述: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 }
相關文章
相關標籤/搜索