3-5-多數組k大值

題目描述:ios

  給定兩個有序數組arr1和arr2,在給定一個整數k,返回兩個數組的全部數中第K小的數。
  例如:
    arr1 = {1,2,3,4,5};
    arr2 = {3,4,5};
    K = 1;
  由於1爲全部數中最小的,因此返回1;數組

    arr1 = {1,2,3};
    arr2 = {3,4,5,6};
    K = 4;
  由於3爲全部數中第4小的數,因此返回3;spa

要求:若是arr1的長度爲N,arr2的長度爲M,時間複雜度請達到O(log(min{M,N}))。code

  1 /*
  2     思路:利用上一題NowClass3-4-GetUpMedian的求上中位數的思路進行求解。
  3         arr1和arr2,其中數組長度分別爲:lenS和lenL(lenS<=lenL)
  4         分狀況分析:
  5             1) kth <= lenS;
  6                 只需求arr1和arr2的前kth個數的上中位數便可。
  7                 即:findProcess(arr1, 0, kth-1, arr2, 0, kth-1).
  8             2) kth > lenL;
  9                 arr1中前kth-lenL-1個數不多是第kth個數,
 10                 arr2中前kth-lenS-1個數不多是第kth個數,
 11                 此時,arr1中剩餘(lenS-(kth-lenL-1))=lenS+lenL+1-kth個可能的數,
 12                 arr2中剩餘(lenL-(kth-lenS-1))=lenL+lenS+1-kth個可能的數。剩餘個數相同。
 13                 而後,先判斷arr1中的第kth-lenL-1個數是否大於arr2的最後一個數,
 14                     若是是則直接返回arr1的第kth-lenL-1個數便可。
 15                     再判斷arr2中的第kth-lenS-1個數是否大於arr1的最後一個數,
 16                     若是是則直接返回arr2的第kth-lenS-1個數。
 17                 不然求arr1的(kth-lenS,lenS)和arr2的(kth-lenL,lenL)的上中位數。
 18                 即:findProcess(arr1,kth-lenS,lenS,arr2,kth-lenL,lenL).
 19             3) lenS < kth <= lenL; 
 20               arr1中lenS個數都有可能,
 21               arr2中(0, kth-1-lenS-1)和(kth-1,lenL-1)不可能,此時剩餘kth-1-(kth-1-lenS-1)=lenS+1個數
 22                 而後,單獨對地kth-lenS-1驗證,是否大於arr1的最後一個數,若是是則直接返回該數;
 23                 不然,求arr1的(0,lenS-1)和arr2的(kth-lenS,kth-1)個數求上中位數。
 24                 即:findProcess(arr1,0,lenS-1,arr2, kth-lenS, kth-1).
 25 */
 26 
 27 #include <iostream>
 28 #include <vector>
 29 using namespace std;
 30 
 31 // 查找兩個數組的上中位數。
 32 int findProcess(vector<int> arr1, int l1, int r1, vector<int> arr2, int l2, int r2){
 33     if (l1 == r1)
 34         return (arr1[l1] < arr2[l2] ? arr1[l1] : arr2[l2]);
 35     // 元素個數爲奇數,則offset=0;不然offset=1.
 36     int offset = ((r1-l1+1)&1) ^ 1;
 37     int mid1 = (l1+r1)/2;
 38     int mid2 = (l2+r2)/2;
 39     if (arr1[mid1] > arr2[mid2])
 40         return findProcess(arr1, l1, mid1, arr2, mid2+offset, r2);
 41     else if(arr1[mid1] < arr2[mid2])
 42         return findProcess(arr1, mid1+offset, r1, arr2, l2, mid2);
 43     else
 44         return arr1[mid1];
 45 }
 46 
 47 int findKthNum(vector<int> arr1, vector<int> arr2, int kth){
 48     if (kth <= 0 || kth > arr1.size()+arr2.size())
 49         exit(-1);
 50     vector<int> arrS = arr1.size() < arr2.size() ? arr1 : arr2;
 51     vector<int> arrL = arr1.size() < arr2.size() ? arr2 : arr1;
 52     int lenS = arrS.size();
 53     int lenL = arrL.size();
 54     if (kth <= lenS)
 55         return findProcess(arrS, 0, kth-1, arrL, 0, kth-1);
 56     else if (kth > lenL){
 57         if (arrS[kth-lenL-1] >= arrL[lenL-1])
 58             return arrS[kth-lenL-1];
 59         else if (arrL[kth-lenS-1] >= arrS[lenS-1])
 60             return arrL[kth-lenS-1];
 61         else
 62             return findProcess(arrS, kth-lenL, lenS-1, arrL, kth-lenS, lenL-1);
 63     }
 64     else{
 65         if (arrL[kth-lenS-1] >= arrS[lenS-1])
 66             return arrL[kth-lenS-1];
 67         else
 68             return findProcess(arrS,0,lenS-1,arrL, kth-lenS, kth-1);
 69     }
 70 }
 71 
 72 int main(){
 73     vector<int> a1;
 74     a1.push_back(1);
 75     a1.push_back(1);
 76     a1.push_back(1);
 77     a1.push_back(2);
 78     a1.push_back(3);
 79     a1.push_back(4);
 80     
 81     a1.push_back(6);
 82     a1.push_back(6);
 83     a1.push_back(6);
 84     
 85     a1.push_back(8);
 86     a1.push_back(8);
 87     a1.push_back(8);
 88     
 89     a1.push_back(10);
 90     a1.push_back(10);
 91     a1.push_back(10);
 92     a1.push_back(11);
 93     a1.push_back(12);
 94     a1.push_back(18);
 95     a1.push_back(19);
 96 
 97     vector<int> a2;
 98     a2.push_back(11);
 99     a2.push_back(19);
100     a2.push_back(21);
101     a2.push_back(33);
102     a2.push_back(42);
103     a2.push_back(50);
104     a2.push_back(50);
105     cout << findKthNum(a1,a2,19) << endl;
106     return 0;
107 }
相關文章
相關標籤/搜索