优先队列
蛋卷在月球烤面包
这个作者很懒,什么都没留下…
展开
-
力扣895 最大频率栈
思路:对有序队列里的元素按照频率排序,如果频率相同,根据index比较得到更大的数,表示离栈顶更近。原创 2022-08-27 16:46:03 · 130 阅读 · 0 评论 -
会议室合集
题目: 给定一个会议时间安排的数组, 每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei), 为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。 示例: 输入: [[0, 30],[5, 10],[15, 20]] 输出: 2 输入: [[7,10],[2,4]] 输出: 1 类似思路可参考力扣56 合并区间 堆里的每个元素表示每个房间使用的结束时间。首先对原始数组排序,使得每段时间的起始时间是从小到.原创 2022-04-29 11:03:39 · 220 阅读 · 0 评论 -
剑指offer40 最小的k个数
public int[] getLeastNumbers(int[] arr, int k){ quickSort(arr,0,arr.length-1); return Arrays.copyOf(arr,k); } public void quickSort(int[] arr,int left,int right){ if(left>=right) return; int low=left; in.原创 2022-03-01 14:00:33 · 55 阅读 · 0 评论 -
力扣179 最大数
思路:可以参考优先队列中Comparator写法总结假设(b+a)>(a+b),compareTo返回1,a直接放在最后一个位置上,不会往上走,说明这是大顶堆。 public String largestNumber(int[] nums) { int len=nums.length; String[] array=new String[len]; for(int i=0;i<len;i++){ array[i]=S..原创 2022-04-05 14:07:24 · 264 阅读 · 0 评论 -
力扣347 前K个高频元素
思路:和力扣215类似,多了先用哈希表存储每个元素出现次数的部分。然后遍历哈希表,依次放入容量为k的小顶堆,最后求堆顶即可。 public int[] topKFrequent(int[] nums, int k){ HashMap<Integer,Integer> map=new HashMap<>(); for(int num:nums){ if(map.containsKey(num)){ .原创 2022-03-02 13:03:44 · 86 阅读 · 0 评论 -
力扣215 数组中的第K个最大元素
思路:求第K个最大元素,就是把递增数组分成两部分,求后一部分的最小值。 求后一部分的最小值,可以用小顶堆存放后一部分的值,最后求堆顶直接求得。 先把数组中先k个值放入堆中,堆内会自动排序,此时堆顶为当前堆中k个值里的最小值。然后依次遍历剩下的元素,和堆顶元素比较大小,如果剩的元素比堆顶大,说明当前堆顶不在最大的k个数里,把堆顶的值去掉,将剩的元素放入堆中,堆内自动排序,直到遍历数组结束。 public int findKthLargest(int[] nums, int k){ Pr原创 2022-03-02 12:07:31 · 191 阅读 · 0 评论 -
剑指offer41 数据流中的中位数
题目要求获取一个数据流排序后的中位数,那么可以使用两个优先队列(堆)实现。 本题使用一个大顶堆和一个小顶堆:大顶堆用来存放较小的那一半值,小顶堆用来存放较大的那一半值。输入数组元素中,需要保持两个堆的长度相等,如果数组长度为奇数,就使小顶堆为长度更大的那一个,最后中位数就是小顶堆的堆顶。 如果直接把值插入到堆里,因为无法确定这个值是较大的那一半还是较小的那一半,如果是较大的那一半,直接放入小顶堆不会破坏顺序,反之如果是较小的那一半,会破坏堆内的顺序,所以: 当两个堆长度一样时,先放入大顶堆,大顶堆重新原创 2022-03-01 16:01:38 · 46 阅读 · 0 评论