数组中的第K个最大元素
时间:2022-07-24
本文章向大家介绍数组中的第K个最大元素,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数组中的第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
题解
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function(arr, k) {
var adjustHeap = function(arr, i, n) {
for(let k=2*i+1; k<n; k=2*k+1){
let parent = arr[i];
if(k+1 < n && arr[k] < arr[k+1]) ++k;
if(parent < arr[k]){
[arr[i], arr[k]] = [arr[k], arr[i]];
i = k;
}else{
break;
}
}
}
var n = arr.length;
for(let i = Math.floor(n/2-1); i>=0; --i) adjustHeap(arr, i, n);
var target = 0;
for(let i=n-1; i>=n-k; --i){
target = arr[0];
if(i-1>=n-k){
[arr[0], arr[i]] = [arr[i], arr[0]];
adjustHeap(arr, 0, i);
}
}
return target;
};
思路
采用大顶堆的数据结构解决问题,大顶堆要求根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值并且为完全二叉树,首先定义adjustHeap
函数左调整堆使用,首先以i
作为双亲元素的下标,以k
作为左孩子的下标,当右孩子存在时判断右孩子是否大于左孩子,大于左孩子则将k
作为右孩子的指向下标,然后判断双亲值与k
指向的孩子的节点值的大小,如果孩子值大于双亲值则交换,并且以k
作为双亲节点沿着路径继续向下调整,否则就结束本次循环,然后定义n
作为数组长度,之后将堆中每个作为双亲节点的子树进行调整,使整个树符合大顶堆的特征,之后进行k
次循环,由于是大顶堆且已调整完成将顶堆的顶值也就是最大值取出赋值给target
,之后判断是否需要进一步调整,如果需要则交换顶端值与最后一个值,然后调整顶堆符合大顶堆的条件,同样取出顶堆最大值,取出k
次即可完成。
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
- 乐视网面试真题,非一般的题目
- 数据挖掘算法-python实现:Logical回归
- 提取数字——字符串、正则面试题
- 【盟友分享】如何快速获取Chromium源码和编译
- .NET中的密钥加密
- 数据挖掘工程师笔试及答案
- 各大公司移动端页面 - 导航的实现
- JavaScript 运行机制之执行顺序详解
- Math对象面试题目
- Highcharts AJAX JSON JQuery 实现动态数据交互显示图表 柱形图
- 企业支付宝账号开发接口教程--JAVA-UTF-8(实际操作------SpringMVC+JSP)
- 用pandas 进行投资分析
- 【专业技术】android 应用程序如何获取root权限
- Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP使用GD库生成文件
- 反向传播算法从原理到实现
- 基于EntityFramework 6 Code First实现多租户的一种思路
- PHP使用GD库生成柱状图
- PHP生成Mysql数据字典
- .Net Core in Docker极简入门(上篇)
- PHP一个比较完善的树形结构代码
- .Net Core in Docker极简入门(下篇)
- snoopy(强大的PHP采集类) 详细介绍
- 十分钟搭建自己的私有NuGet服务器-BaGet
- PHP遍历文件夹下的所有文件和文件夹
- Python 读写 csv 文件的三种方法
- 初识ABP vNext(1):开篇计划&基础知识
- 利用 urllib.request.urlretrieve 函数下载文件
- PHP中class.smtp类