Advertisement
pb_jiang

LC4

Oct 11th, 2022
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     double findMedianSortedArrays(vector<int>& ns1, vector<int>& ns2) {
  4.         if (ns1.size() > ns2.size()) return findMedianSortedArrays(ns2, ns1);
  5.         const int mid = (ns1.size() + ns2.size() + 1) / 2;
  6.         const int total = ns1.size() + ns2.size();
  7.         int lb = 0, ub = ns1.size(), cnt = ub - lb, it, step;
  8.         int low = 0, hight = ns1.size();
  9.         while(cnt) {
  10.             it = lb, step = cnt / 2, it += step;
  11.             int i = lb, j = mid - i;
  12.             int Aleft = (i == 0 ? INT_MIN : ns1[i - 1]);
  13.             int Aright = (i == ns1.size() ? INT_MAX : ns1[i]);
  14.             int Bleft = (j == 0 ? INT_MIN : ns2[j - 1]);
  15.             int Bright = (j == ns2.size() ? INT_MAX : ns2[j]);
  16.             // printf("lb,ub,cnt:%d,%d,%d alr:%d,%d blr:%d,%d\n", lb, ub, cnt, Aleft, Aright, Bleft, Bright);
  17.             if (Aleft <= Bright && Bleft <= Aright) {
  18.                 if (total % 2) {
  19.                     // printf("total:%d it:%d i:%d j:%d mid:%d alr:%d,%d blr:%d,%d\n", total, it, i, j, mid, Aleft, Aright, Bleft, Bright);
  20.                     return max(Aleft, Bleft);
  21.                 } else {
  22.                     // printf("it:%d i:%d j:%d mid:%d alr:%d,%d blr:%d,%d\n", it, i, j, mid, Aleft, Aright, Bleft, Bright);
  23.                     return (max(Aleft, Bleft) + min(Aright, Bright)) / 2.0;
  24.                 }
  25.             } else if (Bleft > Aright) {
  26.                 cnt -= step + 1;
  27.                 lb = it + 1;
  28.             } else {
  29.                 cnt = step;
  30.             }
  31.         }
  32.  
  33.         // while(cnt) {
  34.         while(low <= hight) {
  35.             // it = lb, step = cnt / 2, it += step;
  36.             int i = (hight + low) / 2, j = mid - i;
  37.             int Aleft = (i == 0 ? INT_MIN : ns1[i - 1]);
  38.             int Aright = (i == ns1.size() ? INT_MAX : ns1[i]);
  39.             int Bleft = (j == 0 ? INT_MIN : ns2[j - 1]);
  40.             int Bright = (j == ns2.size() ? INT_MAX : ns2[j]);
  41.             printf("lb,ub,cnt:%d,%d,%d alr:%d,%d blr:%d,%d\n", lb, ub, cnt, Aleft, Aright, Bleft, Bright);
  42.             if (Aleft <= Bright && Bleft <= Aright) {
  43.                 if (total % 2) {
  44.                     printf("total:%d it:%d i:%d j:%d mid:%d alr:%d,%d blr:%d,%d\n", total, it, i, j, mid, Aleft, Aright, Bleft, Bright);
  45.                     return max(Aleft, Bleft);
  46.                 } else {
  47.                     printf("it:%d i:%d j:%d mid:%d alr:%d,%d blr:%d,%d\n", it, i, j, mid, Aleft, Aright, Bleft, Bright);
  48.                     return (max(Aleft, Bleft) + min(Aright, Bright)) / 2.0;
  49.                 }
  50.             } else if (Bleft > Aright) {
  51.                 low = i + 1;
  52.             } else {
  53.                 hight = i - 1;
  54.             }
  55.         }
  56.         // printf("error. lb:%d\n", lb);
  57.         return 0;
  58.     }
  59. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement