LeetCode刷题系列 -- 215. 数组中的第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

来源:力扣(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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章