K-th Order
Find K-th Smallest Pair Distance
Whenever you think of log squared → a sliding window is almost always possible.
kth smallest no in multiplication table
Median of 2 arrays sorted arrays
Idea is simple, you canonicalise and say ⇒ … amid … bmid … an … is the range
Then you can count elements that are for sure to left of bmid, and split based on that. Note that on the else part, only left of amid is known for sure.
class Solution {
public:
double findMedianSortedArrays(vector<int> &a, vector<int> &b) {
int an = (int)a.size(), bn = (int)b.size();
auto kth = [&](auto &&f, vector<int> &a, int al, int ar, vector<int> &b, int bl, int br,
int k) {
if (al > ar)
return b[bl + k - 1];
if (bl > br)
return a[al + k - 1];
// canonicalisaton: ensure a mid <= b mid
int a_mid = (al + ar) / 2, b_mid = (bl + br) / 2;
if (a[a_mid] > b[b_mid]) {
return f(f, b, bl, br, a, al, ar, k);
}
// when ... amid ... bmid ....
// in merged array, elems left of bmid ( excl bmid )
int left = a_mid - al + 1 + b_mid - bl;
if (k <= left) {
return f(f, a, al, ar, b, bl, b_mid - 1, k);
} else {
k -= (a_mid - al + 1); // left of amid
return f(f, a, a_mid + 1, ar, b, bl, br, k);
}
};
int i1 = (an + bn) / 2, i2 = (an + bn - 1) / 2;
double ans = (double)kth(kth, a, 0, an - 1, b, 0, bn - 1, i1 + 1) +
kth(kth, a, 0, an - 1, b, 0, bn - 1, i2 + 1);
ans /= 2;
return ans;
}
};Median of K sorted arrays
Get range of numbers in union all arrays, basically max and min across all. Get total len. Left median index is (total len - 1)/2. Add + 1. This is cnt ⇐ median. Now binary search on condition : are there cnt elements ⇐ mid across all arrays