@@ -902,35 +902,48 @@ treat it like a matrix and then simply do it. */
902902### [ Median of two sorted arrays] ( https://leetcode.com/problems/median-of-two-sorted-arrays/ )
903903
904904``` cpp
905- class Solution {
906- public:
907- double solve(const vector<int > &A, const vector<int > &B, int l, int r, int count)
908- {
909- while (l < r)
910- {
911- // using mid = (l+r)/2 can cause TLE in case [ 0,0,0,0,0] [ -1,0,0,0,0,0,1]
912- // because division of negative i.e. (l+r)/2 can act in reverse sense of floor
913- // l + (r-l)/2 on the other hand divides positive r-l which is always positive
914- int mid = l + (r-l)/2;
915- int cnt = (upper_bound(A.begin(), A.end(), mid) - A.begin()) +
916- (upper_bound(B.begin(), B.end(), mid) - B.begin());
917- if (cnt > count) r = mid;
918- else l = mid+1;
905+ // We can merge both lists using merge sort merge in O(n + m) time and then
906+ // find the median. Can be done in O(1) space since we only care about finding median.
907+
908+ // Use two pointer, both initialized at zero and keep incrementing for smaller value
909+ // until we reach middle position. Time: O(n + m) Space: O(1)
910+
911+ // Using binary search, idea is we find a point in smallest (or equal) array. Such that
912+ // left part before that point and in larger array we can also find a pos (mathematically)
913+ // such that right part after pos combine and form the middle part that will give median.
914+ double findMedianSortedArrays (vector<int >& nums1, vector<int >& nums2){
915+ if (nums1.size() > nums2.size()) return findMedianSortedArrays(nums2, nums1);
916+
917+ int l = 0, r = nums1.size();
918+ while (l <= r){
919+ int mid = l + (r-l)/2;
920+ // Find the partition of the larger array such that the sum of elements on
921+ // left side of the partition in both arrays is half of the total elements.
922+ int pos = ((nums1.size() + nums2.size() + 1) / 2) - mid;
923+
924+ int left1 = (mid > 0) ? nums1[mid - 1] : INT_MIN;
925+ int right1 = (mid < nums1.size()) ? nums1[mid] : INT_MAX;
926+ int left2 = (pos > 0) ? nums2[pos - 1] : INT_MIN;
927+ int right2 = (pos < nums2.size()) ? nums2[pos] : INT_MAX;
928+
929+ // Verify if partition is valid by verifying if the largest number on the
930+ // left side is smaller than the smallest number on the right side.
931+ if (left1 <= right2 && left2 <= right1){
932+ return ((nums1.size() + nums2.size())&1) ?
933+ max(left1, left2) : (double)(max(left1, left2) + min(right1, right2)) / 2;
919934 }
920- return l;
921- }
922- double findMedianSortedArrays(vector<int >& nums1, vector<int >& nums2)
923- {
924- int n = nums1.size(), m = nums2.size();
925- if (n == 0 && m == 0) return 0;
926- else if (m == 0) return (n&1) ? nums1[ n/2] : (nums1[ n/2 - 1] + nums1[ n/2] )/(double)2;
927- else if (n == 0) return (m&1) ? nums2[ m/2] : (nums2[ m/2 - 1] + nums2[ m/2] )/(double)2;
928-
929- int l = min(nums1[ 0] , nums2[ 0] ), r = max(nums1.back(), nums2.back());
930- return ((n+m)&1) ? solve(nums1, nums2, l, r, (n+m)/2) :
931- (solve(nums1, nums2, l, r, (n+m)/2 - 1) + solve(nums1, nums2, l, r, (n+m)/2)) / (double)2;
935+ else if (left1 > right2) r = mid - 1;
936+ else l = mid + 1;
932937}
933- };
938+
939+ /*
940+ Example for [1, 2, 3] - [1, 2, 5, 6]
941+ l: 0, r: 4 mid: 1, pos: 3 l1: 1, r1: 2, l2: 5, r2: 6 X
942+ l: 2, r: 4 mid: 3, pos: 1 l1: 3, r1: ∞, l2: 1, r2: 2 X
943+ l: 2, r: 2 mid: 2, pos: 2 l1: 2, r1: 3, l2: 2, r2: 5
944+ */
945+ return 0;
946+ }
934947```
935948
936949### [Painter's Partition Problem](https://www.interviewbit.com/problems/painters-partition-problem/)
0 commit comments