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

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

题目描述

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

示例 1:

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

示例 2:

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

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

题目分析

  我们主要来学习一个新的集合类型——优先队列。优先队列作用是保证每次取出的元素都是队列中权值最小的

  这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序,也可以通过构造时传入的比较器。我们这里是数组,比较数字大小即可,不需要比较器。

  Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值)。线程不安全。

  既然是小顶堆那么就是下图这样:

  

  无论堆中有几个元素,堆顶的元素一定是最小的,所以我们让堆中仅保留K个元素,那么处于堆顶的元素一定是第K大的(或者说是最小的)。我们始终维持堆的元素在K个,每当超过后,我们就POLL出去堆顶元素,那么最后剩下的K个元素,就是整个数组中最大的K个元素。

  

  比如我们取第三大元素,那么我们的堆大小就恒定为3,每次 将入新元素,重新构造堆,最后的堆顶元素3,就是第3大元素。

关于PriorityQueue的进一步学习,可以参考这篇文章:

    https://github.com/CarpenterLee/JCFInternals/blob/master/markdown/8-PriorityQueue.md  

Java题解

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer>  queue = new PriorityQueue<>();
        for(int num:nums) {
            queue.offer(num);
            if(queue.size()>k)
                queue.poll();
        }
        return queue.peek();
    }
} 

原文地址:https://www.cnblogs.com/MrSaver/p/9987392.html

时间: 2024-12-10 11:59:05

LeetCode:数组中的第K个最大元素【215】的相关文章

LeetCode | 0215. Kth Largest Element in an Array数组中的第K个最大元素【Python】

LeetCode 0215. Kth Largest Element in an Array数组中的第K个最大元素[Medium][Python][快排][堆] Problem LeetCode 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. Example 1:

Leetcode题目215.数组中的第K个最大元素(中等)

题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 思路分析: 思路一:排序+遍历,如果是升序,那就是返回nums[n-k],如果是降序,那就是返回nums[k-1] class

寻找数组中的第K大的元素,多种解法以及分析

遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因为不要求别的信息只要计算出第K大的元素.当然,如果在某种情况下需要频繁访问第K大的元素就可以先进行一次排序在直接得出结果. 第一种方式是这样,用选择排序,冒泡法,或者交换排序这类的排序,对前K个元素进行排序.这三种算法也许不是最快的排序算法.但是都有个性质:计算出最大(小)的元素的算法复杂度是O(N

[LeetCode]215. 数组中的第K个最大元素(堆)

题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例?2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-ele

leetcode 215. 数组中的第K个最大元素(快速排序)

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-element-in-

LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)

题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 解题思路 利用快速排序的思想,在进行排序过程中每次可以确定一个元素的最终位置,若此位置为第K个最大元素,则直接返回此索引,否则继续

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

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 思路 一个sorted再直接返回第K个最大元素就好了 代码 class Solution(object): def findKthLargest(self, nums, k): """ :t

leetcode 215. 数组中的第K个最大元素(python)

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. class Solution: def findKthLargest(self, nums: List[int], k: int) -> int:

215 Kth Largest Element in an Array 数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素.请注意,它是数组有序排列后的第 k 个最大元素,而不是第 k 个不同元素.例如,给出 [3,2,1,5,6,4] 和 k = 2,返回 5.注意事项:你可以假设 k 总是有效的,1 ≤ k ≤ 数组的长度. 详见:https://leetcode.com/problems/kth-largest-element-in-an-array/description/ 方法一: class Solution { public: int findKthLarges