解析 答案:可以使用快速选择算法,类似于快速排序的分区过程,选择一个元素作为基准,将数组分为两部分,一部分比基准大,一部分比基准小。如果基准元素的位置恰好是第k大,则直接返回基准元素。否则,根据基准元素的位置,递归地在比基准大的部分或比基准小的部分中查找第k大的元素。
快速选择算法是基于快速排序的分治思想,时间复杂度为O(n)。首先随机选择一个元素作为基准,然后将数组分为两部分,一部分比基准大,一部分比基准小。如果基准元素的位置正好是第k个,那么它就是第k个最大的元素;如果基准元素的位置大于k,那么在左侧数组中继续查找;如果小于k,那么在右侧数组中继续查找。
这道题正是如此,“数组排序后的第 k 个最大的元素” ,语义是从右边往左边数第 k 个元素(从 1 开始),那么从左向右数是第几个呢,我们列出几个找找规律就好了。 一共6个元素,找第2大,索引是4;6个元素,找第4大,索引是2。 因此,目标元素的索引是 len - k,即找最终排定以后位于 len - k 的那个元...
}returnnums[nums.length -k]; }/*** 调整堆 *@paramarr *@paramlength*/publicvoidadjustHead(int[] arr,intlength) {//从第一个非叶子节点开始for(inti = length / 2 - 1; i >= 0; i--) {//左右选一个最大的intmaxChildIndex = 2 * i + 1;if(maxChildIndex + 1 < length && arr[ma...
在未排序的数组中找到第 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 和整数 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 ...
// 3)返回结果:数组中的第K个最大元素(即 nums[k - 1] )。 var findKthLargest = function(nums, k) { // 1)状态初始化:l = nums.length; 。 const l = nums.length; // 2)核心:2层for循环,i范围为 [0, k), j范围为 [i + 1, l) 。 for (let i = 0; i < k; i++) {...
LeetCode 215. 数组中的第K个最大元素(练习如何建堆并进行堆排序,大顶堆 & 小顶堆),一、题目:二、解题思路:这道题很容易,调用内置sort函数,或者自写10大
215.数组中的第 K 个最大元素(Medium) 快速选择算法是一个非常经典的算法,和快速排序算法是亲兄弟。 原始题目很简单,给你输入一个无序的数组nums和一个正整数k,让你计算nums中第k大的元素。 那你肯定说,给nums数组排个序,然后取第k个元素,也就是nums[k-1],不就行了吗?
数组中的第K个最大元素 - 力扣(LeetCode) (leetcode-cn.com) 这道题思路还是很简单的,排序后取值就可以,或者是用优先级队列。 拓展:如果是上亿的数据量,又该怎么做呢? 解法1:优先级队列 可以用从大到小的队列,直接取第K个数即可 class Solution { public: int findKthLargest(vector<int>& nums, int...