# 0215. Kth Largest Element in an Array ###### tags: `Leetcode` `Medium` `Priority Queue` `Sorting and Searching` `QuickSort` Link: https://leetcode.com/problems/kth-largest-element-in-an-array/ ## 思路 都是借鉴了 [347. Top K Frequent Elements](https://leetcode.com/problems/top-k-frequent-elements/)的思路,一种方法是用PriorityQueue,一种是用QuickSort ### 思路一 QuickSort average: O(N) worst: O(N^2) 由于quicksort每次会确定一个元素的位置,因此只要某次划分的 q 为倒数第 k 个下标的时候,我们就已经找到了答案 ### 思路二 PriorityQueue O(Nlogk)& O(k) 最小堆,保持堆里面只有k个元素,那么最后堆顶元素就是答案~ **这里要注意PriorityQueue的语法** ```PriorityQueue<Integer> minHeap = new PriorityQueue<>(k, (a, b) -> a - b);``` 注意priorityQueue的定义,默认为最小堆,当a-b小于0时,comparator会回传-1,代表a比b小;当a-b大于0时,comparator会回传1,代表a比b大,这时候a就会被排到b的后面,因为priorityQueue默认为最小堆 ```queue.peek()和queue.poll()```都可以拿到堆首值(如果是最小堆就是最小值),区别在于poll()会把它拿走 ## Code in Java ### 思路一 ```java= class Solution { public int findKthLargest(int[] nums, int k) { int start = 0; int end = nums.length-1; int pivot = qsort(nums,start,end); while(true){ if(pivot == k-1){ return nums[pivot]; } else if(pivot > k-1){ end = pivot-1; pivot = qsort(nums, start, pivot-1); } else{ start = pivot+1; pivot = qsort(nums, pivot+1, end); } } } public static void swap(int[] nums, int a, int b){ int temp = nums[a]; nums[a] = nums[b]; nums[b] = temp; } public static int qsort(int[] nums, int start, int end){ int pivot = (start+end)/2; // System.out.println(nums[pivot]+" "+pivot+" "+start+" "+end); swap(nums, pivot, start); int index = start; for(int i = start+1;i <= end;i++){ if(nums[i]>=nums[start]){ swap(nums, i, index+1); index++; } } swap(nums, start, index); // printArray(nums); return index; } } ``` ### 思路二 ```java= class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> pq = new PriorityQueue<>(); for(int i = 0;i < nums.length;i++){ if(i < k){ pq.add(nums[i]); } else { int peek = pq.peek(); if (nums[i] > peek && pq.size() == k) { pq.poll(); pq.add(nums[i]); } } } return pq.peek(); } } ``` ## Result ### 思路一 Runtime: 1 ms, faster than **98.45%** of Java online submissions for Kth Largest Element in an Array. Memory Usage: 41.6 MB, less than **24.63%** of Java online submissions for Kth Largest Element in an Array. ### 思路二 Runtime: 5 ms, faster than **46.11%** of Java online submissions for Kth Largest Element in an Array. Memory Usage: 42.3 MB, less than **9.70%** of Java online submissions for Kth Largest Element in an Array.