数组中的第K个最大元素
给定整数数组 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
提示:
1 <= k <= nums.length <= 104
-104 <= nums[i] <= 104
方法1:
class Solution {
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length-k];
}
}
方法2:
class Solution {
public int findKthLargest(int[] nums, int k) {
nums = heapSort(nums);
return nums[k-1];
}
public void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
// 堆排序
public int[] heapSort(int[] array){
int len = array.length;
for (int i = len/2-1; i >= 0 ; i--) {
adjustHeap(array, i, len);
}
for (int i = len - 1; i >= 0 ; i--) {
swap(array, i, 0);
adjustHeap(array, 0, i);
}
return array;
}
// 调整堆元素
public void adjustHeap(int[] array, int i, int length){
//先取出当前元素i
int temp = array[i];
//从i结点的左子结点开始,也就是2i+1处开始
for(int k=i*2+1;k<length;k=k*2+1){
//如果左子结点小于右子结点,k指向右子结点(k = i*2+1为左节点,k = i*2+1+1为右节点)
if(k+1<length && array[k]>array[k+1]){
k++;
}
//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换,后续归位)
if(array[k] < temp){
array[i] = array[k];
i = k;
}else{
break;
}
}
//将temp值放到最终的位置
array[i] = temp;
}
}