Advertisement
pb_jiang

lc4

Oct 10th, 2022
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. class Solution {
  2.     double findMedian(const vector<int>& vec) {
  3.         int n = vec.size();
  4.         if (n == 0) return 0;
  5.         if (n % 2) {
  6.             return vec[n / 2];
  7.         }
  8.         return 0.5 * (vec[n / 2 - 1] + vec[n / 2]);
  9.     }
  10.     double findMedian(const vector<int>& v, int b, int e) {
  11.         int n = e - b;
  12.         if (n <= 0) return 0;
  13.         if (n % 2) {
  14.             return v[b + n / 2];
  15.         }
  16.         return 0.5 * (v[b + n / 2 - 1] + v[b + n / 2]);
  17.     }
  18.     double sol(const vector<int>& v1, const vector<int> v2, int b1, int e1, int b2, int e2) {
  19.         // printf("b1:%d e1:%d b2:%d e2:%d\n", b1, e1, b2, e2);
  20.         int n1 = (e1 - b1);
  21.         int n2 = (e2 - b2);
  22.  
  23.         if (n1 + n2 <= 4) {
  24.             vector<int> v;
  25.             for (int i = b1; i < e1; ++i) v.push_back(v1[i]);
  26.             for (int i = b2; i < e2; ++i) v.push_back(v2[i]);
  27.             sort(v.begin(), v.end());
  28.            
  29.             int n = v.size(), nh = v.size() / 2;
  30.             if (n % 2) return v[nh];
  31.             return 0.5 * (v[nh - 1] + v[nh]);
  32.         }
  33.        
  34.         if (n1 <= 2 || n2 <= 2) {
  35.             vector<int> v;
  36.             if (n1 <= 2) {
  37.                 for (int i = b1; i < e1; ++i) v.push_back(v1[i]);
  38.                 for (int i = b2 + ((n2 % 2) ? n2 / 2 - 1 : n2 / 2 - 2); i < b2 + n2 / 2 + 2; ++i) v.push_back(v2[i]);
  39.             } else {
  40.                 for (int i = b2; i < e2; ++i) v.push_back(v2[i]);
  41.                 for (int i = b1 + ((n1 % 2) ? n1 / 2 - 1 : n1 / 2 - 2); i < b1 + n1 / 2 + 2; ++i) v.push_back(v1[i]);
  42.             }
  43.            
  44.             sort(v.begin(), v.end());
  45.             int n = v.size(), nh = v.size() / 2;
  46.             if (n % 2) return v[nh];
  47.             return 0.5 * (v[nh - 1] + v[nh]);
  48.         };
  49.        
  50.         int d1 = n1 / 2 - (1 - (n1 % 2));
  51.         int d2 = n2 / 2 - (1 - (n2 % 2));
  52.         int d = min(d1, d2);
  53.         // printf("d1:%d d2:%d d:%d\n", d1, d2, d);
  54.        
  55.         double m1 = findMedian(v1, b1, e1);
  56.         double m2 = findMedian(v2, b2, e2);
  57.        
  58.         if (m1 <= m2) {
  59.             return sol(v1, v2, b1 + d, e1, b2, e2 - d);
  60.         } else {
  61.             return sol(v1, v2, b1, e1 - d, b2 + d, e2);
  62.         }
  63.     }
  64. public:
  65.     double findMedianSortedArrays(vector<int>& ns1, vector<int>& ns2) {
  66.         int n1 = ns1.size(), n2 = ns2.size();
  67.         return sol(ns1, ns2, 0, n1, 0, n2);
  68.     }
  69. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement