215_数组中的第K个最大元素

简介: 215_数组中的第K个最大元素

215_数组中的第K个最大元素

 

package 队列.优先级队列;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
/**
 * https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
 * @author Huangyujun
 *
 */
public class _215_数组中的第K个最大元素 {
    //方法一:利用工具类:Arrays.sort 方法
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length - k];
    }
    //方法二:优先队列【方式2的效率高】
    public int findKthLargest2(int[] nums, int k) {
        //小根堆
        PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;    //注意java中 升序是 o1 - o2【小根堆】,  降序才是 o2 - o1【大根堆】
            }
        });
        //逻辑:先存储进去 k容量数据【小根堆】,跟堆顶比【堆顶太小了,抛弃,【调整一个新的最小值于堆顶】,当前值进入维持容量k】
        //每次都抛弃掉最小的【堆顶】,更换进入大的,剩下的就是大的数据呀
        int len = nums.length;
        for(int i = 0; i < len; i++) {
            if(pQueue.size() < k) {
                pQueue.add(nums[i]);
            }else {
                if(pQueue.peek() < nums[i]){
                    pQueue.remove();
                    pQueue.add(nums[i]);
                }
            }
        }
        return pQueue.peek();
    }
    //方法三:
    class Solution {
        public int findKthLargest(int[] nums, int k) {
            PriorityQueue<Integer> heap = new PriorityQueue<>();
              //小根堆【默认比较器就是升序的,小根堆】
//            PriorityQueue<Integer> heap = new PriorityQueue<Integer>(new Comparator<Integer>() {
//                @Override
//                public int compare(Integer o1, Integer o2) {
//                    return o1 - o2;    //注意java中 升序是 o1 - o2【小根堆】,  降序才是 o2 - o1【大根堆】
//                }
//            });
            //要找第k 大【不断地维持住一个小根堆的数据】:容量达到k时:
            //(1)当前值比较小,【可能会被调整到堆顶】,容量达标,被poll掉
            //(2)当前值比较大,【存储到后边】,容量达标,被poll掉的是当前最小的那个
            //整个逻辑在于不断地维持住一个小根堆【每次都弹出掉最小的】~~~剩下的便是最大的数据了
            for (int num : nums) {
                heap.add(num);
                if (heap.size() > k) {
                    heap.poll();
                }
            }
            return heap.peek();
        }
    }
}
目录
相关文章
|
11月前
|
监控 测试技术
如何进行系统压力测试?
【10月更文挑战第11天】如何进行系统压力测试?
596 34
|
11月前
|
存储 监控 关系型数据库
如何避免使用冗余索引
【10月更文挑战第15天】如何避免使用冗余索引
151 1
|
C语言 Python
C语言数组和指针笔试题(三)(一定要看)
C语言数组和指针笔试题(三)(一定要看)
180 0
|
消息中间件 存储 缓存
什么是零拷贝, 从 Java 到 Netty
什么是零拷贝, 从 Java 到 Netty
213 0
|
SQL 存储 缓存
Hibernate的核心接口
Hibernate的核心接口
|
缓存 测试技术 编译器
防御性编码和单元测试规则
捕捉错误、问题和缺陷的最佳位置是在开发周期的早期。图 1 展示了最容易出现缺陷的地方,以及最容易发现它们的地方,并包括了修复这些缺陷的成本(这些成本是针对 1996 年的 —— 今天的成本显然更高)。
1310 0
|
缓存 Java Windows
java memcache
引用:http://blog.csdn.net/einarzhang/article/details/6064092 Memcache的介绍有很多,这里给出如何在Java中应用Memcache的基本方法     1 安装Memcache服务器(windows) 下载windows版Memcache安装包,如memcached-1.2.6-win32-bin.zip,解压到指定位置,比如(D://memcache),打开dos命令行,输入以下两个命令即可启动Memcache服务。
814 0
|
Web App开发 JavaScript 前端开发
分享25款非常华丽的桌面字体壁纸
  鼓舞人心的桌面壁纸能带给你创造性的思维,进而能够富有成效的完成工作。在这篇文章中我为大家收集了一些以字体为主题的漂亮桌面字体壁纸,希望你会喜欢。 I Love Typography The Characteristics of a Typeface Colorful Fancy L...
960 0
|
5天前
|
人工智能 运维 安全