Skip to content

Commit 3f51e62

Browse files
Create median-of-2-sorted-arrays-of-different-sizes
1 parent c0a15cb commit 3f51e62

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
//{ Driver Code Starts
2+
//Initial Template for C++
3+
4+
#include <bits/stdc++.h>
5+
using namespace std;
6+
double MedianOfArrays(vector<int>& array1, vector<int>& array2);
7+
8+
9+
// } Driver Code Ends
10+
//User function Template for C++
11+
12+
class Solution {
13+
public:
14+
double MedianOfArrays(std::vector<int>& array1, std::vector<int>& array2) {
15+
if (array1.size() > array2.size()) {
16+
return MedianOfArrays(array2, array1);
17+
}
18+
19+
int m = array1.size();
20+
int n = array2.size();
21+
int low = 0, high = m;
22+
23+
while (low <= high) {
24+
int partition1 = (low + high) / 2;
25+
int partition2 = (m + n + 1) / 2 - partition1;
26+
27+
int maxLeft1 = (partition1 == 0) ? INT_MIN : array1[partition1 - 1];
28+
int minRight1 = (partition1 == m) ? INT_MAX : array1[partition1];
29+
30+
int maxLeft2 = (partition2 == 0) ? INT_MIN : array2[partition2 - 1];
31+
int minRight2 = (partition2 == n) ? INT_MAX : array2[partition2];
32+
33+
if (maxLeft1 <= minRight2 && maxLeft2 <= minRight1) {
34+
if ((m + n) % 2 == 0) {
35+
return (std::max(maxLeft1, maxLeft2) + std::min(minRight1, minRight2)) / 2.0;
36+
} else {
37+
return std::max(maxLeft1, maxLeft2);
38+
}
39+
} else if (maxLeft1 > minRight2) {
40+
high = partition1 - 1;
41+
} else {
42+
low = partition1 + 1;
43+
}
44+
}
45+
46+
throw std::invalid_argument("Input arrays are not sorted");
47+
}
48+
};
49+
50+
51+
//{ Driver Code Starts.
52+
53+
int main()
54+
{
55+
int t;
56+
cin>>t;
57+
while(t--)
58+
{
59+
int m,n;
60+
cin>>m;
61+
vector<int> array1(m);
62+
for (int i = 0; i < m; ++i){
63+
cin>>array1[i];
64+
}
65+
cin>>n;
66+
vector<int> array2(n);
67+
for (int i = 0; i < n; ++i){
68+
cin>>array2[i];
69+
}
70+
Solution ob;
71+
cout<<ob.MedianOfArrays(array1, array2)<<endl;
72+
}
73+
return 0;
74+
}
75+
76+
77+
78+
// } Driver Code Ends

0 commit comments

Comments
 (0)