合併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;

	}


};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章