classSolution { public: doublefindMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){ if (nums1.size() > nums2.size()) { swap(nums1, nums2); } nums1.insert(nums1.begin(), INT_MIN); nums2.insert(nums2.begin(), INT_MIN); nums1.push_back(INT_MAX); nums2.push_back(INT_MAX); int m = nums1.size(), n = nums2.size(); // the ultimate goal is to have 2 sets of numbers, with the numbers // in first set less than the numbers in the second set // if we pick l numbers from nums1, then we need to pick (m + n) / 2 - l numbers from nums2 // nums1[l] is in first set, and nums[r] is in second set int l = 0, r = m - 1; while (l + 1 < r) { int idx1 = (l + r) / 2; // it means we would pick [0, mid] elements from nums1 // then we need (m + n) / 2 - mid - 2 from nums2 int idx2 = (m + n) / 2 - idx1 - 2; // for nums1 index >= r, they belong to the second set if (nums1[idx1] > nums2[idx2 + 1]) { r = idx1; } else { l = idx1; } } int idx1 = l, idx2 = (m + n) / 2 - l - 2; return (m + n) % 2 ? min(nums1[idx1 + 1], nums2[idx2 + 1]) : (max(nums1[idx1], nums2[idx2]) + min(nums1[idx1 + 1], nums2[idx2 + 1])) / 2.0; } };
classSolution { public: doublefindMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){ if (nums1.size() < nums2.size()) { swap(nums1, nums2); } nums1.insert(nums1.begin(), INT_MIN); nums2.insert(nums2.begin(), INT_MIN); nums1.push_back(INT_MAX); nums2.push_back(INT_MAX); int m = nums1.size(), n = nums2.size(); // MIN, 2, 4, 5, MAX // MIN, 1, 3, 6, MAX // the ultimate goal is to have 2 sets of numbers, with the numbers // in first set less than the numbers in the second set // if we pick l numbers from nums1, then we need to pick (m + n) / 2 - l numbers from nums2 // first, let's assume all numbers are from nums1 int idx1 = (m + n) / 2 - 2, idx2 = 0; // idx1 -> 4, idx2 -> MIN // idx1 -> 2, idx2 -> 1 while (nums1[idx1] > nums2[idx2 + 1]) { idx1--; idx2++; } // idx1 -> 5, idx2 -> MIN // idx1 -> 4, idx2 -> 1 // idx1 -> 2, idx2 -> 3 return (m + n) % 2 ? min(nums1[idx1 + 1], nums2[idx2 + 1]) : (max(nums1[idx1], nums2[idx2]) + min(nums1[idx1 + 1], nums2[idx2 + 1])) / 2.0; } };