題目:
在未排序的數組中找到第 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
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
思路:
創建一個小頂堆,堆的大小爲 k ,用於存放最大的 k 個元素。遍歷整個數組 nums ,將每次遍歷的元素與小頂堆的頂元素(即堆中最小的元素)num 進行比較,如果大於num則替換該元素,並重新堆化小頂堆。直到遍歷整個數組,則此時小頂堆中最小的元素即爲 數組第 k 個最大的元素
Java代碼
public int findKthLargest(int[] nums, int k) {
int[] tmp = new int[k];
for(int i=0;i<k;i++){
tmp[i] = nums[i];
}
for(int i=k;i<nums.length;i++){
findMinNums(nums[i],tmp);
}
return tmp[0];
}
public void updateArray(int[] tmp){
for(int j=0;j<=tmp.length/2;j++)
for(int i=tmp.length/2;i>=j;i--){
int index = 2*i + 1;
if(index>tmp.length-1){
continue;
}
if(2*i+2<tmp.length&&tmp[index]>tmp[2*i+2]){
index = 2*i+2;
}
if(tmp[i]>tmp[index]){
swap(tmp,i,index);
}
printArray(tmp);
}
}
public void findMinNums(int num,int[] tmp){
updateArray(tmp);
if(num>tmp[0]){
tmp[0] = num;
updateArray(tmp);
}
}
public void swap(int[] tmp,int i,int j){
int t = tmp[i];
tmp[i] = tmp[j];
tmp[j] = t;
}