题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/

215. Kth Largest Element in an Array

My Submissions

Question
Total Accepted: 43442 Total
Submissions: 136063 Difficulty: Medium

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.

For example,

Given [3,2,1,5,6,4] and k = 2, return 5.

Note: 

You may assume k is always valid, 1 ≤ k ≤ array's length.

Credits:

Special thanks to @mithmatt for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

Show Tags
Show Similar Problems
Have you met this question in a real interview?

Yes
No

Discuss

求给定数组的第K大的元素。

假设先排序,然后取第K个元素,那么时间复杂度是O(n*log n)。

借助堆的数据结构,能够把时间复杂度降到O(n*logk)。

假设求第K大的元素,那么要构建的是小顶堆。

求第K小的元素。那么要构建大顶堆!先构建k个元素的堆。另外i-k个元素逐个跟堆顶元素比較。假设比堆顶元素小,那么就将该元素纳入堆中,并保持堆的性质。

我的AC代码

public class KthLargestElementinanArray {

	public static void main(String[] args) {
int[] a = { 3, 2, 1, 5, 6, 4 };
System.out.println(findKthLargest(a, 1));
int[] b = { -1,2,0};
System.out.println(findKthLargest(b, 3));
int[] c = { 3,1,2,4};
System.out.println(findKthLargest(c, 2)); } public static int findKthLargest(int[] nums, int k) {
int[] heap = new int[k]; heap[0] = nums[0];
for (int i = 1; i < k; i++) {
siftUp(nums[i], heap, i);
} for (int i = k; i < nums.length; i++) {
siftDown(nums, k, heap, i);
} return heap[0];
} private static void siftDown(int[] nums, int k, int[] heap, int i) {
if (nums[i] > heap[0]) {
heap[0] = nums[i];
int p = 0;
while(p < k) {
int minChild = 2 * p + 1;
if(minChild + 1 < k && heap[minChild] > heap[minChild + 1]) minChild ++;
if(minChild < k && heap[p] > heap[minChild]) {
swap(heap, p, minChild);
p = minChild;
} else break;
}
}
} private static void siftUp(int num, int[] heap, int i) {
int p = i;
heap[i] = num;
while (p != 0) {
int parent = (p - 1) / 2;
if (heap[parent] > heap[p]) {
swap(heap, p, parent);
}
p = parent;
}
} private static void swap(int[] heap, int p, int parent) {
int temp = heap[parent];
heap[parent] = heap[p];
heap[p] = temp;
}
}

LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解的更多相关文章

  1. LeetCode OJ 215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  2. 【LeetCode】215. Kth Largest Element in an Array (2 solutions)

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  3. 【刷题-LeetCode】215. Kth Largest Element in an Array

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  4. 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...

  5. 【leetcode】215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  6. 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

    传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5, ...

  7. 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)

    注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...

  8. LN : leetcode 215 Kth Largest Element in an Array

    lc 215 Kth Largest Element in an Array 215 Kth Largest Element in an Array Find the kth largest elem ...

  9. leetcode面试准备:Kth Largest Element in an Array

    leetcode面试准备:Kth Largest Element in an Array 1 题目 Find the kth largest element in an unsorted array. ...

随机推荐

  1. muduo总结

    总结说的有的过大,算是对自己学习的一个总结.兴许会不断补充. 模型总结 muduo是基于非堵塞的IO和事件驱动的网络库. muduo的总体结构时one loop per thread+threadpo ...

  2. JavaScript的那些坑之变量提升

    想总结一下JS的变量提升特性,都是由于一道题.先上题. var name = 'World!'; (function () { if (typeof name === 'undefined') { v ...

  3. POJ 2771 最大独立集 匈牙利算法

    (为什么最大独立集的背景都是严打搞对象的( _ _)ノ|壁) 思路:匈牙利算法 没什么可说的-- // by SiriusRen #include <cstdio> #include &l ...

  4. Java NIO(七)管道

    Java NIO 管道是两个线程之间的单向数据连接.Pipe有一个source通道和sink通道(内部类).数据会被写到sink通道,从source通道读取. 给一张Pipe通道的原理图: 创建管道: ...

  5. WCF(二)配置文件

    上篇文章中对WCF的配置放到App.config中,这样可以使程序更灵活.更具有扩展性. 下面说下配置文件中各个节点的含义. 服务端: WCF配置文件节点放在<system.serviceMod ...

  6. hdu 3416 Marriage Match IV 【 最短路 最大流 】

    求边不可重复的最短路条数 先从起点到终点用一次dijkstra,再从终点到起点用一次dijkstra,来判断一条边是否在最短路上 如果在,就将这条边的两个端点连起来,容量为1 再跑一下dinic(), ...

  7. 响应式网页设计:互联网web产品RWD概念

    RWD(Responsive Web Design)可称为自适应网页设计.响应式网页设计.响应式网页设计等等,是一种可以让网页的内容可以随着不同的装置的宽度来调整画面呈现的技术,让使用者可以不需要透过 ...

  8. php语法学习:轻松看懂PHP语言

    基础语法 开头结尾 PHP脚本以 "<?php " 开头以 "?>" 结尾 <!DOCTYPE html> <html>&l ...

  9. swift使用查阅资料备份4

    Swift - RxSwift的使用详解6(观察者2: 自定义可绑定属性) http://www.hangge.com/blog/cache/detail_1946.html extension UI ...

  10. Smalltalk

    Smalltalk is an object-oriented, dynamically typed, reflective programming language. Smalltalk was o ...