【LeetCode】215. 数组中的第K个最大元素

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

知识点:数组;排序;分治;堆;单调

题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

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

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

解法一:排序

这道题和剑指offer 40题一样,都是Top-K问题,所以可以使用排序,快速选择,堆来进行求解。

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

解法二:分治:快速选择

直接分治然后使用快速选择;

class Solution { public int findKthLargest(int[] nums, int k) { return quickSelect(nums, nums.length-k, 0, nums.length-1); } private int quickSelect(int[] nums, int k, int left, int right){ int i = left, j = right; while(i < j){ while(i < j && nums[j] > nums[left]) j--; while(i < j && nums[i] <= nums[left]) i++; swap(nums, i, j); } swap(nums, left, i); if(k < i) return quickSelect(nums, k, left, i-1); if(k > i) return quickSelect(nums, k, i+1, right); return nums[i]; } private void swap(int[] nums, int i, int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }

解法三:堆

维持一个容量为k的小根堆,如果新来的比堆顶大,入堆;新来的比堆顶小,不管。

class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> queue = new PriorityQueue<>(); //维持一个容量为k的小根堆; for(int i = 0; i < k; i++){ queue.offer(nums[i]); //前k个直接入堆; } for(int i = k; i < nums.length; i++){ if(nums[i] > queue.peek()){ queue.poll(); queue.offer(nums[i]); } //比堆顶小的不管了,大的就更新;所以最后就是k个最大的;堆顶就是第k个; } return queue.peek(); } }

相关链接

TopK问题


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15133554.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(620)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】215. 数组中的第K个最大元素』
点击右上角即可分享
微信分享提示