vector删除第i个元素_LeetCode每日一题 Q215数组中的第K个最大元素
Question 215: Kth Largest Element in an Array
Difficulty: Medium
题目描述
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例:
输入: [3,2,1,5,6,4] 和 k = 2输出: 5
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
题目分析
显然这道题可以先排序,再去找第K大的值,但这种暴力解法显然不是最优解。在这里我们可以维护一个大小为K的最小堆minheap来实现。
本题目的算法并不难,但我们需要了解一下堆的概念。
关于堆
堆就是用数组实现的二叉树,所有它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。
堆的常用方法:
•构建优先队列•支持堆排序•快速找出一个集合中的最小值(或者最大值)
堆分为两种:最大堆 和 最小堆,两者的差别在于节点的排序方式。
在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”,并且这个属性对堆中的每一个节点都成立。
这是一个最大堆,,因为每一个父节点的值都比其子节点要大。10
比 7
和 2
都大。7
比 5
和 1
都大。
根据这一属性,那么最大堆总是将其中的最大值存放在树的根节点。而对于最小堆,根节点中的元素总是树中的最小值。堆属性非常的有用,因为堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素。
题解
显然,遍历数组中的元素,并维护一个大小为K的minHeap,最后堆顶元素即为所求。遍历每个元素,并每次都要进行一次heapify,则时间复杂度为O(N log K),由于维护了大小为K的minHeap则空间复杂度为O(log K)。
//Java 解法class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> minHeap = new PriorityQueue<>(k, new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2){ if(o1.equals(o2)) return 0; return o1 < o2 ? -1 : 1; } } ); for(int i = 0; i < nums.length; i++){ if(minHeap.size() < k){ minHeap.add(nums[i]); }else if(nums[i] > minHeap.peek()){ minHeap.poll(); minHeap.add(nums[i]); } } return minHeap.poll(); }}
#python 解法class Solution: def findKthLargest(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ return heapq.nlargest(k, nums)[-1]
vector删除第i个元素_LeetCode每日一题 Q215数组中的第K个最大元素相关推荐
- [Leedcode][第215题][JAVA][数组中的第K个最大元素][快排][优先队列]
[问题描述][中等] 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素.示例 1:输入: [3,2,1,5,6,4] 和 k ...
- 215.数组中的第K个最大元素/347. 前 K 个高频元素
2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...
- 数组中的第K个最大元素
数组中的第K个最大元素 在未排序的数组中找到第k个最大的元素.请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素. 示例 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...
- 215. 数组中的第 K个最大元素
215. 数组中的第 K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数 组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5 ...
- LC215. 数组中的第K个最大元素
题目介绍 数组中的第K个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素. 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 输入: [ ...
- 在数组中查找第k个最大元素_查找数组中每个元素的最近最大邻居
在数组中查找第k个最大元素 Problem statement: 问题陈述: Given an array of elements, find the nearest (on the right) g ...
- 【LeetCode】【HOT】215. 数组中的第K个最大元素(优先队列)
[LeetCode][HOT]215. 数组中的第K个最大元素 文章目录 [LeetCode][HOT]215. 数组中的第K个最大元素 package hot;import java.util.Co ...
- LeetCode——215,数组中的第K个最大元素(分治法)
尹成老师带你学算法 /*** \* Created: liuhuichao* \* Date: 2020/1/27* \* Time: 11:32 上午* \* Description: 数组中的第K ...
- 力扣(LeetCode)215. 数组中的第K个最大元素(C语言)
一.环境说明 本文是 LeetCode 215题 : 数组中的第K个最大元素,使用c语言实现. 快速选择.查找无序数组的利器! 测试环境:Visual Studio 2019. 二.代码展示 void ...
最新文章
- 一个多maven项目聚合的实例
- jenkins 忘记密码_持续集成工具Jenkins 在CentOS系统下安装
- MapReduce: 提高MapReduce性能的七点建议【译】
- java后期发展方向_2020年前3季度工程自卸车市场咋样?后期朝啥方向发展?
- 印度孟买机器人餐厅_印度孟买自动化展:该国最重要、规模最大的国际自动化展...
- [daily] fedora用过光盘做dnf repo
- By Recognizing These Guys, We Find Social Networks Useful(HDU-3849)
- Linux(debian7)操作基础(十四)之文本搜索命令grep使用方法
- python爬虫教程-Python爬虫入门教程——爬取自己的博客园博客
- 什么是波导的简并波,矩形波导和圆波导中的简并有何异同
- 基于asp.net729在校大学生助学贷款管理系统
- python移动文件,将一个文件夹里面的文件移动到另一个文件夹
- MySQL Workbench 8.0 CE 汉化包下载
- VGA分辨率无法识别或错误通过添加自定义配置参数正确显示(Ubuntu/Windows)
- 【深度学习】眼底图像之视盘和黄斑分割的探索
- 故障排查:阿里云轻量应用服务器中的MySQL容器自行停止
- 21天转型容器实战营(八容器进阶之Kubernetes 应用生命周期原理分析)
- 站内搜索 迅搜xunsearch 中小型网站的福音
- 阅读vue3官方文档之摘录
- 奇兔recovery卡刷教程_奇兔开发者学院课程教学第四讲: Recovery备份提取制作ROM
热门文章
- Linux 中的进程管理
- 前沿分享|阿里云数据库解决方案资深专家 李圣陶:云原生数据库解决方案 加速企业国产化升级
- 《Saas模式云原生数据仓库应用场景实践》激活数据生产力,让分析产生价值
- 技术与商业到底啥关系?我们从业务角度聊一聊
- 基于 Unity 中的 NGUI 插件,通用的 UI 如何设计
- SQL Server语句大全(增删改查数据、创建表、删除表、修改表)
- VS code 使用 Remote-SSH 进行python远程开发
- 修改大表字段属性报主键冲突
- 如何解决AIX的文件系统故障
- CONFIGURE CONTROLFILE AUTOBACKUP ON/OFF;