leetcode--堆排序经典题目解析汇总

这篇博客详细解析了堆排序在LeetCode中的应用,包括小顶堆的构建过程和四个经典题目:前k个高频元素、前k个高频单词、最小的k个数、第k个数。通过实例探讨了如何利用Java中的PriorityQueue实现堆排序,并指出在解决此类问题时的关键点和注意事项。
摘要由CSDN通过智能技术生成

目录

堆的概念

题目一:前k个高频元素

题目二:前k个高频单词

题目三:最小的k个数

题目四:第k个数


堆的概念

堆包括最大堆和最小堆:最大堆的每一个节点(除了根结点)的值不大于其父节点;

                                       最小堆的每一个节点(除了根结点)的值不小于其父节点。

java中使用PriorityQueue(优先队列)实现堆的功能,且默认为小顶堆。

堆的定义,定义语法可见我的另外一篇博客:https://blog.csdn.net/yezonghui/article/details/115412927

小顶堆的构建过程

注意:就算是相同的数组序列,不同的插入顺序,最终出来的堆都可能不一样,

所以不能直接对完整序列进行处理,需要一个个插入操作。

小顶堆的插入操作:

1)每次插入操作接在最下层空位的最右边,然后进行调整

2)调整的时候从按照从下到上,从右到左的顺序对非叶结点进行调整

(这是因为叶结点显然满足小顶堆的要求)。

每次调整目的都是要保证根结点比孩子结点小,如果不满足,

就与孩子结点中更小的那一个互换,然后再对换下去的结点检查并调整直至到底层或者满足。

3)每次插入都会影响整体的树,所以所有的非叶结点都需要进行调整

题目一:前k个高频元素

(题目链接:https://leetcode-cn.com/problems/top-k-frequent-elements/

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:

输入: nums = [1], k = 1
输出: [1]

思路:堆排序:记住记住记住:求前k大的元素,我们用小顶堆,小顶堆,小顶堆

          (如何理解:小顶堆的堆顶是最小元素,遇到较大的数,便于被替换

难点:如何定义这个堆

PriorityQueue<int[]> pqueue = new PriorityQueue<int[]>(

            (a,b)->(a[1]-b[1])

 );

class Solution {
    public int[] topKFrequent(int[] nums, int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值