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

问题描述

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值