题意
题解
求覆盖 k k k 个列表至少一个元素的最小区间,那么对于满足条件的区间 [ l , r ] [l,r] [l,r],右界右移后的区间 [ l , r + 1 ] [l,r+1] [l,r+1] 也一定满足条件。最小区间的左右界一定是 k k k 个列表中的元素,遍历元素记录对应列表索引,使其有序后,尺取法求解即可。
class Solution
{
typedef pair<int, int> P;
public:
vector<int> smallestRange(vector<vector<int>> &nums)
{
int n = 0, k = nums.size(), i = 0;
for (auto x : nums) n += x.size();
vector<P> xs(n);
for (vector<vector<int>>::iterator it = nums.begin(); it != nums.end(); ++it)
{
int id = it - nums.begin();
for (auto x : (*it))
{
xs[i++] = P(x, id);
}
}
sort(xs.begin(), xs.end());
vector<int> res(2), cnt(k);
int s = 0, t = 0, num = 0, len = xs[n - 1].first - xs[0].first + 1;
for (;;)
{
while (t < n && num < k)
{
if (cnt[xs[t++].second]++ == 0) ++num;
}
if (num < k) break;
if (xs[t - 1].first - xs[s].first < len)
{
int l = xs[s].first, r = xs[t - 1].first;
len = r - l, res[0] = l, res[1] = r;
}
if (--cnt[xs[s++].second] == 0) --num;
}
return res;
}
};