LintCode 486: Merge K Sorted Arrays (經典題)
阿新 • • 發佈:2018-12-13
解法1: 利用priority queue + tuple。 記得我們需要最小堆,因為sorting是從小到大排序。而priority queue預設是用最大堆,所以需要define class cmp 和 bool operator()。 tuple<i,j,k> 記錄了k=arrays[i][j]。 時間複雜度應該是 O(N log k). N is the total number of integers. k is the number of arrays.
程式碼如下:
class cmp { public: // to ensure a min-heap, otherwise it is max-heap by default bool operator() (tuple<int, int, int> &a, tuple<int, int, int> &b) { return get<2>(a) > get<2>(b); } }; class Solution { public: /** * @param arrays: k sorted integer arrays * @return: a sorted array */ vector<int> mergekSortedArrays(vector<vector<int>> &arrays) { tuple<int, int, int> tp; //tuple<i,j,k> => k = arrays[i][j] priority_queue<tuple<int, int, int>, vector<tuple<int, int ,int>>, cmp> pq; vector<int> result; int arrayLen = arrays.size(); for (int i = 0; i < arrayLen; ++i) { if (arrays[i].size() != 0) { pq.push(make_tuple(i, 0, arrays[i][0])); } } while(!pq.empty()) { tuple<int, int, int> elem = pq.top(); pq.pop(); result.push_back(get<2>(elem)); get<1>(elem)++; if (get<1>(elem) < arrays[get<0>(elem)].size()) { pq.push(make_tuple(get<0>(elem), get<1>(elem), arrays[get<0>(elem)][get<1>(elem)])); } } return result; } };