LeetCode 215. 数组中的第K个最大元素
//1.使用最小堆,或最大堆 // 根据 k 的不同,选最大堆和最小堆,目的是让堆中的元素更小 class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> queue = new PriorityQueue<>(); for(int num : nums){ queue.add(num); //如果队列的容量已经超过 K个,那么弹出堆顶元素,内部的元素由堆来调整 if(queue.size() > k){ queue.poll(); } } return queue.peek(); } }
//2.使用快排 class Solution { public int findKthLargest(int[] nums, int k) { int len = nums.length; int left = 0; int right = len - 1; int target = len - k; while(true){ int index = partition(nums,left,right); if(index == target){ return nums[index]; }else if( index < target){ left = index + 1; }else{ right = index - 1; } } } public int partition(int[] nums,int left,int right){ // pivot为基准位 int pivot = nums[left]; int j = left; for(int i = left + 1;i <= right;i++){ if(nums[i] < pivot){ //小于 pivot 的元素 都被交换到前面 j++; swap(nums,j,i); } } //在之前的遍历过程中,满足[left+1,j] < pivot, 并且(j,i] >= pivot swap(nums,j,left); //交换以后 [left,j - 1] < piovt , nums[j] = piovt,[j + 1,right] >= piovt return j; } //交换nums[i] 与 nums[j]的位置 public void swap(int[] nums,int i,int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }