合并k个有序数组

题目:

合并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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值