链接: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出最小的元素。

 

 

 

【LeetCode】堆 heap(共31题)
 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 };
View Code

本题可以有 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,如果这个楼是进来的话,就看当前高度它是不是最高的,如果是,那么这个点在答案中,如果这个楼是出去的话,先把这个高度删除,然后看当前这个高度是不是比剩下所有楼都高,如果是,就把当前坐标和剩下的最高的楼组成的坐标加入答案中。

【LeetCode】堆 heap(共31题)
 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 };
View Code

相关文章:

  • 2021-09-28
  • 2021-12-13
  • 2021-08-04
  • 2021-04-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-26
  • 2021-12-23
  • 2021-05-21
  • 2021-12-29
  • 2022-03-01
  • 2021-07-09
相关资源
相似解决方案