Leetcode 215. 数组中的第K个最大元素

数组中的第K个最大元素 题目链接

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

解法一:接近作弊。

用 Arrays.sort() 方法将数组排序,按序输出第 K 大的值。
也可以自己实现一个快速排序来解答

class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length-k];
    }
}

解法二:
利用二叉堆 求 Top K 的思路解答。维护一个容量为 K 的小顶堆,当数组遍历结束,完成堆的建立与更新,此时的小顶堆堆顶就是第 K 大的元素。

class Solution {
    private int[] heap;
    private int len;
    private int count;
    public int findKthLargest(int[] nums, int k) {
        heap = new int[k+1];
        len = k;
        for(int i=0;i<nums.length;i++)
            insert(nums[i]);
        return heap[1];
    }
    private void insert(int num)
    {
        if(count==len)
        {
            count=len;
            if(num<=heap[1])
                return ;
            else
            {
                removeMin();
                
            }
        }
        count++;
        heap[count]=num;
        int i = count;
        while(i/2>0&&heap[i]<heap[i/2])
        {
            swap(heap,i,i/2);
            i/=2;
        }
    }
    public void removeMin() // 移除小顶堆堆顶
    {
        
        heap[1] = heap[count];
        
        count--;
        heapfy();
    }
    private void heapfy() // 自顶向下堆化
    {
        int minPos;
        int i=1;
        while(true)
        {
            minPos=i;
            if(i*2<=count&&heap[minPos]>heap[2*i])
                minPos=2*i;
            if(2*i+1<=count&&heap[minPos]>heap[2*i+1])
                minPos=2*i+1;
            if(minPos==i)
                break;
            swap(heap, i, minPos);
            i=minPos;
        }
    }
    private void swap(int[] nums,int index1,int index2)
    {
        int temp = nums[index1];
        nums[index1]=nums[index2];
        nums[index2]=temp;
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值