leetcode_找到第 k 大的元素

排序

1 class Solution {
2     public int findKthLargest(int[] nums, int k) {
3         Arrays.sort(nums);
4         return nums[nums.length-k];
5     }
6 }

 

利用小根堆

 1 class Solution {
 2     public int findKthLargest(int[] nums, int k) {
 3         PriorityQueue<Integer> minHeap = new PriorityQueue<>();
 4         for(int num:nums){
 5             minHeap.add(num);
 6             if(minHeap.size()>k) minHeap.poll();
 7         }
 8         return minHeap.peek();
 9     }
10 }

 

快速排序

 1 public int findKthLargest(int[] nums, int k) {
 2 k = nums.length - k;
 3 int l = 0, h = nums.length - 1;
 4 while (l < h) {
 5 int j = partition(nums, l, h);
 6 if (j == k) {
 7 break;
 8 } else if (j < k) {
 9 l = j + 1;
10 } else {
11 h = j - 1;
12 }
13 }
14 return nums[k];
15 }
16 private int partition(int[] a, int l, int h) {
17 int i = l, j = h + 1;
18 while (true) {
19 while (a[++i] < a[l] && i < h) ;
20 while (a[--j] > a[l] && j > l) ;
21 if (i >= j) {
22 break;
23 }
24 swap(a, i, j);
25 }
26 swap(a, l, j);
27 return j;
28 }
29 private void swap(int[] a, int i, int j) {
30 int t = a[i];
31 a[i] = a[j];
32 a[j] = t;
33 }

 

posted @ 2019-09-23 20:52  chyblogs  阅读(223)  评论(0)    收藏  举报