Skip to content

Commit 774bee6

Browse files
Update searching.md
1 parent bb3f395 commit 774bee6

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

‎searching.md‎

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
classSolution{
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+
doublefindMedianSortedArrays(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

Comments
(0)