首页 > 代码库 > 215. Kth Largest Element in an Array

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 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.

链接: http://leetcode.com/problems/kth-largest-element-in-an-array/

7/16/2017

偷懒用了priority queue,并且把所有元素都放进了pq当中,没有限制pq的大小--这里导致时间复杂度有变化:

如果是pq size k: 总是保存最大的k个值,time complexity: O(k + (N - k)logk) = O(Nlogk)

如果size是N: time complexity: O(NlogN)

注意第6行开头用Queue而不是PriorityQueue

可以用heap,Radix sort或者Quick-Select

O(NlogN):

 1 public class Solution {
 2     public int findKthLargest(int[] nums, int k) {
 3         int len = nums.length;
 4         int n = len - k;
 5         
 6         Queue<Integer> pq = new PriorityQueue<Integer>();
 7         for (int i = 0; i < nums.length; i++) {
 8             pq.add(nums[i]);
 9         }
10         for (int i = 0; i < n; i++) {
11             pq.poll();
12         }
13         return pq.poll();
14     }
15 }

O(Nlogk)即只保存最大的k个值的做法:(算法书Algorithm 6B)

 1 public class Solution {
 2     public int findKthLargest(int[] nums, int k) {
 3         int len = nums.length;
 4         
 5         Queue<Integer> pq = new PriorityQueue<Integer>();
 6         for (int i = 0; i < nums.length; i++) {
 7             if (pq.size() < k) {
 8                 pq.offer(nums[i]);
 9             } else {
10                 if (nums[i] > pq.peek()) {
11                     pq.poll();
12                     pq.offer(nums[i]);
13                 }
14             }
15         }
16         return pq.peek();
17     }
18 }

别人的答案

https://discuss.leetcode.com/topic/14597/solution-explained

https://discuss.leetcode.com/topic/15256/4-c-solutions-using-partition-max-heap-priority_queue-and-multiset-respectively

更多讨论

https://discuss.leetcode.com/category/223/kth-largest-element-in-an-array

215. Kth Largest Element in an Array