链接:https://leetcode.com/tag/heap/
【23】 Merge k Sorted Lists
【215】 Kth Largest Element in an Array (无序数组中最小/大的K个数)(2018年11月30日第一次复习)
给了一个无序数组,可能有重复数字,找到第 k 个最大的元素并且返回这个元素值。
题解:直接用直接用个堆保存数组中最大的 K 个数。时间复杂度是 O(NlogK)。
priority_queue<int> xxx 大根堆
priority_queue<int, vector<int>, greater<int>> xxxx 小根堆
这道题我们可以 maintain 一个大小只有 k 个元素的小根堆。一旦超过 k 个元素,就从堆里面 pop出最小的元素。
1 //时间复杂度是 O(NlogK), 用堆辅助。
2 class Solution {
3 public:
4 int findKthLargest(vector<int>& nums, int k) {
5 const int n = nums.size();
6 priority_queue<int, vector<int>, greater<int>> pq;
7 for (int i = 0; i < n; ++i) {
8 if (pq.size() < k) {
9 pq.push(nums[i]);
10 } else {
11 if (pq.top() < nums[i]) {
12 pq.pop();
13 pq.push(nums[i]);
14 }
15 }
16 }
17 return pq.top();
18 }
19 };
本题可以有 O(N) 的解法,详见《剑指offer》或者《程序员代码面试指南》P336
做法是quickSelect。
【218】 The Skyline Problem(2019年2月5日,算法群打卡复习)
给了一个tuple list, 每个三元组 [a, b, h] 代表一个楼的x轴坐标是在[a, b],楼的高度是 h,返回所有楼轮廓的左上角坐标。
题解:用了一个 multiset 来存这个楼是进来还是出去,如果是进来,就存[a, h], 如果是出去,就存[b, -h]。 然后遍历这个 multiset,如果这个楼是进来的话,就看当前高度它是不是最高的,如果是,那么这个点在答案中,如果这个楼是出去的话,先把这个高度删除,然后看当前这个高度是不是比剩下所有楼都高,如果是,就把当前坐标和剩下的最高的楼组成的坐标加入答案中。
1 class Solution { 2 public: 3 vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) { 4 for (auto& b : buildings) { 5 record.insert(make_pair(b[0], b[2])); 6 record.insert(make_pair(b[1], -b[2])); 7 } 8 vector<pair<int, int>> ret; 9 for (auto& r : record) { 10 bool entry = r.second > 0 ? true : false; 11 int idx = r.first, h = abs(r.second); 12 // printf("idx = %d, h = %d, entry = %d\n", idx, h, entry); 13 if (entry) { 14 if (h > getMaxHeight()) { 15 ret.push_back(make_pair(idx, h)); 16 } 17 height.insert(h); 18 } else { 19 auto iter = height.find(h); 20 height.erase(iter); 21 if (h > getMaxHeight()) { 22 ret.push_back(make_pair(idx, getMaxHeight())); 23 } 24 } 25 } 26 return ret; 27 } 28 struct kcmp { 29 bool operator() (const pair<int, int>& p1, const pair<int, int>& p2) const { 30 if (p1.first == p2.first) { 31 return p1.second > p2.second; 32 } 33 return p1.first < p2.first; 34 } 35 }; 36 multiset<pair<int, int>, kcmp> record; 37 multiset<int> height; 38 int getMaxHeight() { 39 if (height.empty()) {return 0;} 40 return *height.rbegin(); 41 } 42 };