DESC:
在未排序的数组中找到第 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说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
CODE:
JAVA:
class Solution { public int findKthLargest(int[] nums, int k) { if (nums == null || nums.length == 0 || k<=0) { return -1; } int n = nums.length; quickSort(nums, 0, n-1, n-k);//第k大索引坐标 return nums[n-k]; } public void quickSort(int[] nums, int left, int right, int target) { if (left > right) { return; } int pos = partition(nums, left, right); //找到就退出,目的非完成排序 if (target == pos) { return; } //在含第k的区间进行快排查找,节省时间 if (pos > target) { quickSort(nums, left, pos-1, target); } else { quickSort(nums, pos+1, right, target); } } public int partition(int[] nums, int left, int right) { int val = nums[left]; while (left < right) { while (left<right && nums[right]>=val) { right--; } swap(nums, left, right); while (left<right && nums[left]<=val) { left++; } swap(nums, left, right); } return left; } public void swap (int[] nums, int left, int right) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; } }
NOTES:
- 可借助快排思想,在快排的过程中,判断每次的分界是否是正好是要查找的目标
- 没有必要完成排序,只需要快排目目标存在的区间