image.png

思路

思路是创建一个大顶堆,将所有数组中的元素加入堆中,并保持堆的大小小于等于 k。这样,堆中就保留了前 k 个最大的元素。这样,堆顶的元素就是正确答案。

像大小为 k 的堆中添加元素的时间复杂度为O(logk),我们将重复该操作 N 次,故总时间复杂度O(Nlogk)。

  1. public int findKthLargest(int[] nums, int k) {
  2. PriorityQueue<Integer> heap = new PriorityQueue<>((n1,n2)->n1-n2);
  3. for(int n:nums){
  4. heap.add(n);
  5. if(heap.size()>k)
  6. heap.poll();
  7. }
  8. return heap.peek();
  9. }

快速排序

使用快速排序的思想

  1. public int findKthLargest(int[] nums, int k) {
  2. return quickSelect(nums,0,nums.length-1,k);
  3. }
  4. int quickSelect(int[] nums,int low,int high,int k){
  5. int pivot = low;
  6. for (int j = low; j < high; j++) {
  7. if (nums[j] <= nums[high]) {
  8. swap(nums, pivot++, j);
  9. }
  10. }
  11. swap(nums, pivot, high);
  12. int count = high - pivot + 1;
  13. // pivot is the one!
  14. if (count == k) return nums[pivot];
  15. // pivot is too small, so it must be on the right
  16. if (count > k) return quickSelect(nums, pivot + 1, high, k);
  17. // pivot is too big, so it must be on the left
  18. return quickSelect(nums, low, pivot - 1, k - count);
  19. }
  20. void swap(int[] nums,int x,int y){
  21. int temp = nums[x];
  22. nums[x] = nums[y];
  23. nums[y] = temp;
  24. }