LeetCode #215 求数组中第k大的数 有趣的一个小细节

该博客介绍了LeetCode第215题的解决方案,通过创建最大堆实现寻找数组中第k大的数。作者分享了两种解题思路,包括排序和使用最大堆,并指出在实现最大堆时因静态变量导致的错误及修正方法,以此提醒读者对代码保持敬畏之心。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

翻译过来:给你一个无序的整数数组,求其中第k大的数。比如下面的一组输入(第一行)和输出(第二行):

Input: [3,2,1,5,6,4] and k = 2
Output: 5

代码及其思路

这种题还是比较简单的,一般有两种思路:

  • 先排序然后依次输出,直到第k个,这种思路一般借助快排,时间复杂度O(nlog(N)),比较常规;
  • 第二种思路是建立最大堆或者最小堆,一种优先级队列的方式,遍历复杂度O(N)*堆调整复杂度O(log(N)),所以总的复杂度还是O(Nlog(N)).

我比较喜欢自己设计最大堆最小堆,所以这里定义了一个最大堆来解决。详细思路可以参考代码中的注释,写的比较清楚了。本来可以一次性AC的,由于偷懒,所以第一次提交,报错:数组下标越界!(excuse me?)

经过思考,想来应该是偷懒将MaxHeap类的私有变量用static修饰,导致在系统测试时,每次nextIndex的值都在递增,而不是新的一次用例从初始值开始(静态类变量),所以在构造函数里面每次初始化一下AC了!!!

特此记录!提醒自己时刻对代码保持敬畏之心!!

代码如下:

class Solution {
   
    public int findKthLargest(int[] nums, int k) {
   
        int len = nums.length;
        MaxHeap maxHeap = new MaxHeap(len);
        for (int val : nums) {
   
            maxHeap.push(val);
        }
        for (int i = 0; i < k - 1; i++) {
   
            maxHeap.pop();
        }
        return maxHeap.pop();
    }
}
class MaxHeap {
   
    private stati
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值