day13 栈与队列

2023-10-26

LeetCode 239 力扣

* 维护一个单调队列

* 入队列时,保证单调递减(可以将小于待入队的数全部移除)

* 出队列,如果不是队首出(最大元素),无需处理

package algor.trainingcamp;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author lizhe
 * @version 1.0
 * @description: TODO
 * @date 2023/4/18 08:21
 *
 */
public class LeetCode239_RE {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(null == nums){
            return nums;
        }

        int size = nums.length - k + 1;
        int[] res = new int[size];
        int idx = 0;

        //先将前k个元素放入队列
        MySimpleQueue queue = new MySimpleQueue();
        for(int i = 0;i < k;i++){
            queue.add(nums[i]);
        }
        //前k个元素产生一个最大值
        res[idx++] = queue.peek();

        //从k到nums.length - 1进行队列的出入
        /**
         * 出: nums[i - k]
         * 入: nums[i]
         */
        for(int i = k;i < nums.length;i++){
            queue.poll(nums[i - k]);
            queue.add(nums[i]);
            res[idx++] = queue.peek();
        }

        return res;
    }
}

/**
 * 维护一个单调队列
 * 1、插入时,维护单调递减即可 eg: 4,2 如果需要插入3 可以将小于3的值全部移除
 * 2. 删除时,如果不是最大的值,无需删除
 * 3. peek 找到队列顶部即可
 */
class MySimpleQueue {
    Deque<Integer> queue = new LinkedList<>();

    /**
     * 插入元素时,将小于待插入元素的数据全部移除
     */
    public void add(int val){
        while(!queue.isEmpty() && val > queue.getLast()){
            queue.removeLast();
        }

        queue.add(val);
    }

    /**
     * 弹出元素
     * 如果发现队列不为空 且 value等于最大值 才需要弹出
     */
    public void poll(int value){
        if(!queue.isEmpty() && value == queue.peek()){
            queue.poll();
        }
    }

    public int peek(){
        return queue.peek();
    }
}

LeetCode 347 力扣

* TOPK 先记录下单词的频次,再使用最小堆处理

package algor.trainingcamp;

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Set;

/**
 * @author lizhe
 * @version 1.0
 * @description: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
 * @date 2023/4/17 08:04
 *
 * 1. 统计出现频率
 * 2. 构建小顶堆(小顶堆每次弹出都是堆顶的元素),留下了最大的N个数
 * 3. 每次进行小顶堆出堆 直到剩下N个数
 */
public class LeetCode347 {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : nums){
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
        //默认小顶堆
        PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());

        for (Map.Entry<Integer, Integer> entry : entries) {
            queue.offer(entry);

            if(queue.size() > k){
                queue.poll();
            }
        }

        int[] res = new int[k];
        for(int i = k - 1;i >= 0;i--){
            res[i] = queue.poll().getKey();
        }

        return res;
    }

    public static void main(String[] args) {
        LeetCode347 demo = new LeetCode347();
        demo.topKFrequent(new int[]{1,1,1,2,2,3}, 2);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

day13 栈与队列 的相关文章

随机推荐

  • 如何记录键盘SIGQUIT次数

    Unix信号 在计算机科学中 信号 英语 Signals 是Unix 类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式 它是一种异步的通知机制 用来提醒进程一个事件已经发生 当一个信号发送给一个进程 操作系统中断了进
  • EOS与以太坊有哪些区别?

    以太坊是一个专门为开发和运行去中心化应用 DAPP 搭建的智能合约平台 EOS与以太坊类似 同样是基于智能合约和区块链而搭建 但是 从技术和设计理念等方面来看 这两者之间实际上存在明显的区别 那么EOS和以太坊到底有什么区别呢 这个问题要从
  • 深入了解接口测试:Postman 接口测试指南

    在现代软件开发生命周期中 接口测试是一个至关重要的部分 使用 Postman 这一工具 可以轻松地进行 接口测试 以下是一份简单的使用教程 帮助你快速上手 安装 Postman 首先 你需要在电脑上安装 Postman 你可以从官网上下载并
  • python如何取0到无穷大_python如何表示无穷大

    float inf 表示正无穷 float inf 或 float inf 表示负无穷 其中 inf 均可以写成 Inf 起步 python中整型不用担心溢出 因为python理论上可以表示无限大的整数 直到把内存挤爆 而无穷大在编程中常常
  • 使用 Mapbox 在 Vue 中开发一个地理信息定位应用

    本文首发自 前端修罗场 点击加入 是一个由 资深开发者 独立运行 的专业技术社区 我专注 Web 技术 Web3 区块链 答疑解惑 面试辅导以及职业发展 博主创作的 前端面试复习笔记 点击订阅 广受好评 已帮助多人提升实力 拿到 offer
  • 20210601

    一 调整系统的共享内存上限 今天遇到创建32个大小为100MB的共享内存失败 原因是创建的共享内存总大小超过了系统允许的共享内存上限 查询系统共享内存上限的命令是 ipcs l ops g null kernel ipcs l Shared
  • nodejs原生搭建后端服务

    node nodejs原生搭建后端服务 nodejs写后端 默默的小跟班的博客 CSDN博客
  • CentOS8下安装配置Wireguard

    1 CentOS8 0服务端安装 yum update y yum install epel release https www elrepo org elrepo release 8 el8 elrepo noarch rpm yum i
  • nova policy overide (by quqi99)

    作者 张华 发表于 2023 05 19 版权声明 可以任意转载 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 Problem ExternalNetworkAttachForbidden will be thrown w
  • 【无标题】

    C bug记录 request for member endTime in something not a structure or union 粗心的时候经常遇到这个问题 但有时候就想不起来原因 这是因为对指针结构体的成员变量使用了 但应
  • 学习记录679@scp 拷贝当前主机某目录下某段时间内的文件到另一台服务器

    要按拷贝当前服务器的下的某个文件夹下的某段时间内的文件到另一台服务器 需要结合find exec scp命令 如下 我在当前主机下执行 拷贝此目录下的时间介于2020 12 24和2020 12 31之间的文件 注意不包括2020 12 3
  • Linux软件安装管理:在VMware挂载本地iso光盘镜像、配置yum软件仓库

    在操作VMware安装Linux系统后由于安装CentOS 7的最小化安装少了一些工具 比如 ifconfig 及 netstat 等 由于没问外部在线网络环境访问下载相关依赖包 则我们需要配置离线依赖库 本次操作是在Vmware上操作的
  • 在cesium中使用3D地形数据terrain builder的打开步骤

    本来题目名字叫做 大龄无经验程序员终成正果 纪念上班第三天 后加之后再 不行 必须把这篇博文发出去了 本篇用cesium terrain builder生成cesium可以使用的地形数据并用cesium terrain server发布 使
  • API函数的调用过程

    API函数的调用过程 ring3 Windows API Application Programing Interface 应用程序接口 简称API函数 Windows 有多少个API 主要是存放在C WINDOWS system32下面所
  • 如何理解面向对象编程(OOP)

    想要理解OOP 首先需要清楚什么是对象 所谓对象就是由一组数据结构和处理它们的方法组成的 划重点 数据 包括对象的特性 状态等的静态信息 方法 也就是行为 包括该对象的对数据的操作 功能等能动信息 把相同行为的对象归纳为类 类是一个抽象的概
  • python网络请求错误:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

    在用pycharm3 7做socket实验的时候 出现错误 Traceback most recent call last File D Maindocuments Mainsoftware PycharmProjects socket c
  • 逻辑左移、逻辑右移、算术左移、算术右移、循环左移、循环右移

    逻辑左移时 最高位丢失 最低位补0 逻辑右移时 最高位补0 最低位丢失 算术左移时 依次左移一位 尾部补0 最高的符号位保持不变 算术右移时 依次右移一位 尾部丢失 符号位右移后 原位置上复制一个符号位 循环左移时 将最高位重新放置最低位
  • docker mysql镜像有那几个版本

    Docker MySQL 镜像有几个版本可供选择 例如 MySQL 8 0 MySQL 5 7 MySQL 5 6 MySQL 5 5 你可以在 Docker Hub 上查看最新的 MySQL 镜像版本
  • Dell R710 iDRAC6 远程控制卡设置

    IPMI设置 设置服务器主板BIOS 以启用 iDRAC6 控制卡 启用iDRAC6 控制卡 配置 IP 用户名 密码 默认情况下 启用的 iDRAC6 网络界面使用静态 IP 地址 192 168 0 120 必须对其进行配置 才能访问i
  • day13 栈与队列

    LeetCode 239 力扣 维护一个单调队列 入队列时 保证单调递减 可以将小于待入队的数全部移除 出队列 如果不是队首出 最大元素 无需处理 package algor trainingcamp import java util De