Merge k Sorted Arrays (Ladder)
Description
Given k sorted integer arrays, merge them into one sorted array.
Example
Given 3 sorted arrays:[ [1, 3, 5, 7], [2, 4, 6], [0, 8, 9, 10, 11] ] return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].
Challenge
Do it in O(N log k).
N is the total number of integers. k is the number of arrays.
Link
Method
- x
- x
Example
- 1
struct node { int val; int k; int pos; node(int _val, int _k, int _pos): val(_val), k(_k), pos(_pos) {} node(): val(0), k(0), pos(0) {} }; struct comparator{ bool operator() (struct node n1, struct node n2) { return n1.val > n2.val; } }; class Solution { public: /** * @param arrays k sorted integer arrays * @return a sorted array */ vector<int> mergekSortedArrays(vector<vector<int>>& arrays) { // Write your code here if (arrays.empty()) { return {}; } const int k = arrays.size(); bool notend = true; vector<int> result; priority_queue<node, vector<node>, comparator> minheap; int totalnum = 0; // put the front into minheap for (int i = 0; i < k; ++i) { if (arrays[i].empty()) { continue; } totalnum += arrays[i].size(); int pos = 0; int val = arrays[i][pos]; minheap.push(node(val, i, pos)); } // find the min result.resize(totalnum); int index = 0; while (!minheap.empty()) { node tmp = minheap.top(); minheap.pop(); result[index++] = tmp.val; if (tmp.pos +1 < arrays[tmp.k].size()) { tmp.pos += 1; tmp.val = arrays[tmp.k][tmp.pos]; minheap.push(tmp); } } return result; } };
Similar problems
x
Tags
x