LeetCode刷题系列 -- 215. 数组中的第K个最大元素

    技术2022-07-10  90

    题目:

       在未排序的数组中找到第 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; }

     

    Processed: 0.009, SQL: 9