题目:
合并k个有序数组。
分析:
利用一个大小为k的小根堆(代码里用multiset表示),每次取堆顶的数字,直到大根堆为空。
struct node
{
static vector<vector<int>>* ptr;
int i;
int j;
node(int a, int b) :i(a), j(b) {}
};
vector<vector<int>>* node::ptr = nullptr;
struct compare
{
bool operator()(const node &a,const node &b)//注意:必须有const!
{
return (*node::ptr)[a.i][a.j] < (*node::ptr)[b.i][b.j];
}
};
vector<int> merge(vector<vector<int>> &nums)
{
vector<int> res;
if (nums.size() == 0)
return res;
if (nums.size() == 1)
{
res = nums[0];
return res;
}
node::ptr = &nums;
multiset<node, compare> m;
for (int i = 0; i < nums.size(); ++i)
{
if (nums.empty())
continue;
node tmp(i, 0);
m.emplace(tmp);
}
while (!m.empty())
{
node tmp = *m.begin();
res.push_back(nums[m.begin()->i][m.begin()->j]);
m.erase(m.begin());
++tmp.j;
if (tmp.j<nums[tmp.i].size())
m.emplace(tmp);
}
return res;
}