题目链接
题目描述
给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
提示:
class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> pq = new PriorityQueue<Integer>();for(int num : nums){if(pq.size() < k){pq.offer(num);}else{if(pq.peek() < num){pq.poll();pq.offer(num);}}}return pq.peek();}}
- 时间复杂度 O(n log n)
- 空间复杂度 O(log n)
方法二:快速排序
利用快排思想直接缩小每次的范围。
class Solution {int index;Random random;public int findKthLargest(int[] nums, int k) {random = new Random();qSort(nums, 0, nums.length - 1, k);return index;}private void qSort(int[] nums, int left, int right, int k){if(left > right){return;}swap(nums, left, left + random.nextInt(right - left + 1));int val = nums[left];int l = left, r = right;while(l < r){while(l < r && nums[r] >= val){--r;}if(l < r){nums[l++] = nums[r];}while(l < r && nums[l] < val){++l;}if(l < r){nums[r--] = nums[l];}}nums[l] = val;// 大于等于val的正好有K个if(right - l + 1 == k){index = val;return;}// 大于等于val的多余K个,继续在右半个区域查找第K大的值if(right - l + 1 > k){qSort(nums, l + 1, right, k);}else{// 大于等于val的小余K个,继续在左半个区域查找第K - (右边元素个数)大的值qSort(nums, left, l - 1, k - right + l - 1);}}private void swap(int[] nums,int i, int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}
class Solution {public int findKthLargest(int[] nums, int k) {heapSort(nums);return nums[nums.length - k];}private void heapSort(int[] nums){for(int i = nums.length / 2; i >= 0; --i){buildMaxHeap(nums, nums.length, i);}for(int i = nums.length - 1; i > 0; --i){swap(nums, 0, i);buildMaxHeap(nums, i, 0);}}private void buildMaxHeap(int[] nums, int len, int i){int longest = i;int left = 2 * i + 1;int right = 2 * i + 2;if(left < len && nums[left] > nums[longest]){longest = left;}if(right < len && nums[right] > nums[longest]){longest = right;}if(longest != i){swap(nums, i, longest);buildMaxHeap(nums, len, longest);}}private void swap(int[] nums, int left, int right){int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;}}
- 时间复杂度 O(n)
- 空间复杂度 O(log n)
