leetcode 215. 数组中的第K个最大元素【小顶堆】

  1. 方法1:排序后返回倒数第k个元素。
  2. 利用小顶堆,构建k个元素的小顶堆,将数组中最大的k个数全部入堆,则堆顶元素即为答案。
class Solution {
    public int findKthLargest(int[] nums, int k) {
        buildHeap(nums, k);
        for(int i=k; i<nums.length; i++){
            //与堆顶元素相等的数也应该入堆
            if(nums[i] < nums[0]){
                continue;
            }else{
                swap(nums, i, 0);
                heapify(nums, k, 0);
            }
        }
        for(int i=0; i<k; i++){
            System.out.println(nums[i]);
        }
        return nums[0];
    }
    public void buildHeap(int[] nums, int k){
        for(int i=k/2-1; i>=0; i--){
            heapify(nums, k, i);
        }
    }
    public void heapify(int[] a, int k, int index){
        int min = index;
        while(true){
            if(index*2+1<k && a[index*2+1] < a[index]){
                min = index*2+1;
            }
             if(index*2+2<k && a[index*2+2] < a[min]){
                min = index*2+2;
            }
            if(min == index)break;
            
            swap(a, index, min);
            //从交换后的节点开始继续往下堆化
            index = min;
        }
    }
    public void swap(int[] a, int i, int m){
        int temp = a[i];
        a[i] = a[m];
        a[m] = temp;
    }
}
发布了55 篇原创文章 · 获赞 0 · 访问量 792

猜你喜欢

转载自blog.csdn.net/er_ving/article/details/104686035