LC堆、优先队列
堆
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
LeetCode 313. 超级丑数(优先队列)
class Solution { public: int nthSuperUglyNumber(int n, vector<int> &primes) { priority_queue<long long, vector<long long>, greater<long long>> buff; unordered_set<long long> primeset; buff.原创 2022-09-13 00:54:42 · 131 阅读 · 0 评论 -
LeetCode 692. 前K个高频单词 (小根堆、map)
692. 前K个高频单词 class Solution { public List<String> topKFrequent(String[] words, int k) { Map<String,Integer> count = new HashMap<>(); for(var s:words) { count.put(s,count.getOrDefault(s,0)+1); }原创 2021-05-20 12:03:36 · 60 阅读 · 0 评论 -
LeetCode 407. 接雨水 II (unfinished 建模困难、优先队列)
407. 接雨水 II 错误想法: const int N = 110; class Solution { public: int lx[N][N],rx[N][N]; int ty[N][N],by[N][N]; int trapRainWater(vector<vector<int>>& g) { int m = g.size() , n = g[0].size(); if(m<=2 || n<=2) r原创 2021-03-17 15:41:42 · 119 阅读 · 0 评论 -
LeetCode 1792. 最大平均通过率 (堆、贪心、多路归并)
1792. 最大平均通过率 对于每个人的收益增长是一个单调不增的序列; k 个人就是有 k 个 单调不增的序列; 实际上就是一个多路归并问题,用一个最大堆实现即可。 需要注意的是,数据溢出和double类型的精度问题。 class Node{ int a,c; Node(int a,int c){ this.a = a; this.c = c; } } class Solution { public double maxAverageRat原创 2021-03-16 08:53:11 · 202 阅读 · 0 评论 -
LeetCode 703. 数据流中的第 K 大元素 (堆)
数据流中的第 K 大元素 优先队列 class KthLargest { private PriorityQueue<Integer> pq; private int k; public KthLargest(int k, int[] nums) { this.k = k; pq = new PriorityQueue<>(); for(int x:nums){ insert(x);原创 2021-02-11 09:30:57 · 106 阅读 · 0 评论 -
LeetCode 1102 得分最高的路径(优先队列、二分+图的联通性)
1102. 得分最高的路径 最短路做法(优先队列) class Solution { int[] dx = {1,0,-1,0}; int[] dy = {0,-1,0,1}; class Vertex{ int val,x,y; Vertex(int val,int x,int y){ this.val = val; this.x = x; this.y = y;原创 2021-01-31 23:42:25 · 800 阅读 · 1 评论 -
LeetCode 295. 数据流的中位数 剑指 Offer 41. 数据流中的中位数 ( 索引AVL、堆 )
数据流中的中位数 题意: 要求动态维护一个 有序序列,并且快速求出它的中位数。 由于要多次插入一个新的数据,并且多次询问中位数,所以操作的时间复杂度都应该O(logn)O(logn)O(logn)一下。 两个堆 qa 是小根堆,保存较大的一半,那么堆顶就是紧靠中间的数字。 qb 是大根堆,保存较小的一半,那么堆顶就是紧靠中间的数字。 这样刚好能取出中位数。 (PS:java的优先队列默认是小根堆) class MedianFinder { /** initialize your原创 2021-01-16 13:40:42 · 139 阅读 · 0 评论 -
LeetCode 剑指 Offer 40. 最小的k个数 (堆排、快排、计数排序)
// 计数排序 class Solution { public int[] getLeastNumbers(int[] arr, int k) { int[] cnt = new int[10010]; for(int x:arr){ cnt[x]++; } int[] ans = new int[k]; int pos = 0; for(int i=0;i<=10000;i原创 2021-01-01 13:57:35 · 135 阅读 · 0 评论 -
LeetCode 合并有序线性数据结构(88. 合并两个有序数组 、21. 合并两个有序链表、23. 合并K个排序链表 )
88. 合并两个有序数组 双指针 class Solution { public: void merge(vector<int>& a1, int m, vector<int>& a2, int n) { vector<int> temp; int i=0,j=0; while(i<m || j<n){ if(i<m && j<n){原创 2020-08-03 20:00:46 · 101 阅读 · 0 评论 -
LeetCode 378. 有序矩阵中第K小的元素 (堆+多路归并、 二分(非常经典))
有序矩阵中第K小的元素 class Solution { public: int n; int kthSmallest(vector<vector<int>>& a, int k) { n = a.size(); int l = a[0][0], r = a[n-1][n-1] , mid; int ans = 0; while(l<r){ mid = ((long原创 2020-07-13 20:30:36 · 163 阅读 · 0 评论 -
LeetCode 973. 最接近原点的 K 个点(模拟)
最接近原点的 K 个点 class Solution { public: vector<vector<int>> kClosest(vector<vector<int>>& points, int K) { typedef pair<int,int> P; priority_queue<P,vector<P>,greater<P>> pq; for(原创 2020-07-14 01:57:16 · 78 阅读 · 0 评论