合并k个排序数组(优先级队列(小顶堆)或归并)

在这里插入图片描述
合并K个排序链表思路完全相同。
法1:归并
法2:优先级队列(小顶堆)

class Solution {
	//归并
public:
	int kthSmallest(vector<vector<int>>& matrix, int k) {
		vector<int>res = merge(matrix, 0, matrix.size()-1);
		return res[k - 1];


	}

	vector<int>merge(vector<vector<int>>& matrix, int left, int right)//[left, right]的vector合并排序,成为一个大的有序的vector
	{
		if (left == right)return matrix[left];
		int mid = left + (right - left) / 2;
		vector<int>A = merge(matrix, left, mid);
		vector<int>B = merge(matrix, mid + 1, right);
		return mergeTwoVector(A, B);


	}

	vector<int> mergeTwoVector(vector<int>&A, vector<int>&B)//归并两个升序序列
	{
		vector<int>temp(A.size() + B.size());
		int A_start = 0;
		int B_start = 0;
		int start = 0;
		while (A_start < A.size() && B_start < B.size())
		{
			if (A[A_start] <= B[B_start])
			{
				temp[start++] = A[A_start++];
			}
			else
			{
				temp[start++] = B[B_start++];
			}
		}
		if (A_start == A.size())
		{
			while (B_start < B.size())
			{
				temp[start++] = B[B_start++];
			}
		}
		else
		{
			while (A_start < A.size())
			{
				temp[start++] = A[A_start++];
			}
		}
		return temp;



	}

};
#include <functional>
class Solution {
	//归并
public:

	int kthSmallest(vector<vector<int>>& matrix, int k) {
		struct point
		{
			int val, x, y;
			point(int val, int x, int y) : val(val), x(x), y(y) {}
			bool operator> (const point& a) const { return this->val > a.val; }
		};
		priority_queue<point, vector<point>, greater<point>> pri_queue;//维护一个三个元素的小顶堆
		for (int i = 0; i < matrix.size(); i++)
		{
			pri_queue.push(point(matrix[i][0], i, 0));
		}
		for (int i = 0; i < k - 1; i++)
		{
			point temp = pri_queue.top();
			pri_queue.pop();
			if (temp.y + 1 < matrix[temp.x].size())
			{
				pri_queue.push(point(matrix[temp.x][temp.y + 1], temp.x, temp.y + 1));
			}
		}
		return pri_queue.top().val;

	}


};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值