Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- double median(std::vector<int> V1, std::vector<int> V2)
- {
- if (V1.size() > V2.size())
- {
- V1.swap(V2);
- };
- int s1 = V1.size();
- int s2 = V2.size();
- int low = 0;
- int high = s1;
- while (low <= high)
- {
- int px = (low + high) / 2;
- int py = (s1 + s2 + 1) / 2 - px;
- int maxLeftX = (px == 0) ? MIN : V1[px - 1];
- int minRightX = (px == s1) ? MAX : V1[px];
- int maxLeftY = (py == 0) ? MIN : V2[py - 1];
- int minRightY = (py == s2) ? MAX : V2[py];
- if (maxLeftX <= minRightY && maxLeftY <= minRightX)
- {
- if ((s1 + s2) % 2 == 0)
- {
- return (double(std::max(maxLeftX, maxLeftY)) + double(std::min(minRightX, minRightY)))/2;
- }
- else
- {
- return std::max(maxLeftX, maxLeftY);
- }
- }
- else if(maxLeftX > minRightY)
- {
- high = px - 1;
- }
- else
- {
- low = px + 1;
- }
- }
- throw;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement