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;
    }

 

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