给你一个二维数组(有K行),每一行都已经按升序排列。
请你将所有行合并到一个升序数组中,返回合并后的数组。
本题是LeetCode 合并K个升序链表的变形
采用小顶堆存放每一行的第一个元素,每一行的下标index会依次往后移动。这里直接使用C++ STL 的priority_queue来实现小顶堆。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct Node {
int val;
int i;
int j;
bool operator < (const Node& a) const {
return this->val > a.val;
}
};
vector<int> mergeKSortedVector(vector<vector<int> >& inputs) {
int m = inputs.size(), n = inputs[0].size();
if (m <= 1) return inputs[0];
priority_queue<Node> que;
for (int i = 0; i < m; i++) {
que.push({inputs[i][0], i, 0});
}
vector<int> ret;
while (!que.empty()) {
Node top = que.top();
que.pop();
ret.push_back(top.val);
if (top.j + 1 < n) que.push({inputs[top.i][top.j + 1], top.i, top.j + 1});
}
return ret;
}
int main() {
vector<vector<int> > inputs = {{1,3,5},{2,4,6},{7,11,29}};
vector<int> ret = mergeKSortedVector(inputs);
cout << ret.size() << endl;
for (auto num : ret) {
cout << num << " ";
}
return 0;
}