每日三题-数组中的第K个最大元素、滑动窗口最大值、前K个高频元素

简介: 每日三题-数组中的第K个最大元素、滑动窗口最大值、前K个高频元素

数组中的第K个最大元素


31bbc71b3e254e8d826ca266cbfcc216.png

解法一

暴力

先排序再返回

class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        return nums[nums.length-k];
    }
}

解法二

优先队列

维护一个长度为k的小根堆

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> p = new PriorityQueue<Integer>(k);
        for(int i = 0;i < nums.length;i++){
            if(p.size() == k){
                if(p.peek() < nums[i]){
                  p.poll();  
                  p.add(nums[i]);
                }
                continue;      
            }else{
                p.add(nums[i]);
            }
        }
        return p.poll();
    }
}


滑动窗口最大值


0891857aa1824732b77e29378cca1434.png

解法一

滑动窗口

滑动窗口维护一个nums[i]值递减的序列

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int len = nums.length;
        if(k == 1 || len == 1 || len < k) return nums;
        LinkedList<Integer> list = new LinkedList<>();
        // 维护一个降序的双向队列 
        // 【1,3,-1】 = > [3,-1] =》[1,2]//下标
        for(int i = 0;i < k;i++){
            while(!list.isEmpty() && nums[i] > nums[list.peekLast()]){
                list.pollLast();
            }
            list.addLast(i);
        }
        int ans[] = new int[len-k+1];
        ans[0] = nums[list.peekFirst()];
        for(int i = k;i < len;i++){
            while(!list.isEmpty() && nums[i] > nums[list.peekLast()]){
                list.pollLast();
            }
            list.addLast(i);
            // 避免越界
            while(!list.isEmpty() && list.peekFirst() <= i-k){
                list.pollFirst();
            }
            ans[i-k+1] = nums[list.peekFirst()];
        }
        return ans;
    }
}


前K个高频元素


99f7719c468d422ea64f21e7ed054cae.png

解法一

优先队列

先遍历获取频数数组再回去前k个

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < nums.length;i++){
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);
        }
        PriorityQueue<Integer> p = new PriorityQueue<Integer>((num1,num2)->{
            return map.get(num1) - map.get(num2);
        });
        map.forEach((key,value)->{
            if(p.size() < k){
                p.add(key);
            }else{
                if(map.get(p.peek()) < map.get(key)){
                    p.poll();
                    p.add(key);
                }
            }
        });
        int ans [] = new int[k];
        int j = 0;
        while(!p.isEmpty()){
            ans[j++] = p.poll(); 
        }
        return ans;
    }
}


目录
打赏
0
0
0
0
4
分享
相关文章
现代IM系统中聊天消息的同步和存储方案探讨
本文原作者:木洛,阿里云高级技术专家,内容有删减和修订,感谢原作者。 1、前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。
5313 0
C#数据分表核心代码
C#数据分表核心代码
99 0
快速克隆KVM 虚拟机
【4月更文挑战第29天】
120 3
妙用Dataphin的Python三方包管理
Dataphin 中的 Python 计算任务不随意增加内置 module 是为了避免安装包过大和升级时间延长。用户可通过执行 "pip list" 或 "pip3 list" 查看内置 module 列表。 Dataphin 的 Python 环境在镜像中固定,无法用户直接修改,但 v3.14 版本起支持在线安装或上传安装三方包,预安装后在任务中显式引入。对于依赖操作系统库的 module,用户需上传包含相应程序的自定义安装包进行预安装。此外,此功能也可扩展用于管理 shell 任务所需的系统程序。
358 0
构建高效微服务架构:API网关与服务发现的融合实践
【5月更文挑战第29天】 在微服务架构中,服务的分布式特性要求精确的服务发现机制和灵活的流量控制手段。本文将探讨如何通过合并API网关和服务发现功能来优化后端服务的通信效率,降低延迟,并提升系统的可伸缩性。我们将分析传统模式下两者独立运作的弊端,并提出一种集成方案,该方案不仅能够简化系统架构,还能增强服务的自愈能力。文章还将讨论实施过程中可能遇到的挑战及相应的解决策略。
Quartz-Spring集成Quartz通过XML配置的方式
Quartz-Spring集成Quartz通过XML配置的方式
226 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问