代码学习记录11

news2025/1/20 13:18:47

随想录日记part11

t i m e : time: time 2024.03.04



主要内容:今天的主要内容是深入了解栈和队列中比较难的题录类型:滑动窗口最大值与前 K K K 个高频元素,最后对于这三天学习的队列和栈的知识进行总结。

  • 239. 滑动窗口最大值
  • 347.前 K 个高频元素
  • 总结


Topic1滑动窗口最大值

题目
给你一个整数数组 n u m s nums nums,有一个大小为 k k k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k k k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。

示例
输入: n u m s = [ 1 , 3 , − 1 , − 3 , 5 , 3 , 6 , 7 ] , k = 3 nums = [1,3,-1,-3,5,3,6,7], k = 3 nums=[1,3,1,3,5,3,6,7],k=3
输出: [ 3 , 3 , 5 , 5 , 6 , 7 ] [3,3,5,5,6,7] [3,3,5,5,6,7]
解释:

滑动窗口的位置最大值
[1   ~   3   ~   -1]   ~   -3   ~   5   ~   3   ~   6   ~   73
1   ~   [3   ~   -1   ~   -3]   ~   5   ~   3   ~   6   ~   73
1   ~   3   ~   [-1   ~   -3   ~   5]   ~   3   ~   6   ~   75
1   ~   3   ~   -1   ~  [-3   ~   5   ~   3]   ~   6   ~   75
1   ~   3   ~   -1   ~   -3   ~   [5   ~   3   ~   6]   ~   76
1   ~   3   ~   -1   ~   -3   ~   5   ~   [3   ~   6   ~   7]7

思路: 使用单调队列是本题主要的思路:难点是如何求一个区间里的最大值

为了实现实现上述目标,因此需要创建出一个这样的队列:放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是:

class MyQueue {
public:
    void pop(int value) {
    }
    void push(int value) {
    }
    int front() {
        return que.front();
    }
};

每次窗口移动的时候,调用 q u e . p o p que.pop que.pop(滑动窗口中移除元素的数值), q u e . p u s h que.push que.push(滑动窗口添加元素的数值),然后 q u e . f r o n t ( ) que.front() que.front() 就返回我们要的最大值
其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。看看下面的动画演示:
请添加图片描述
此时单调队列里维护着 { 5 , 4 } \{5, 4\} {5,4} 配合窗口进行滑动要保持如下规则:

  • p o p ( v a l u e ) pop(value) pop(value):如果窗口移除的元素 v a l u e value value 等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
  • p u s h ( v a l u e ) push(value) push(value):如果 p u s h push push 的元素 v a l u e value value 大于入口元素的数值,那么就将队列入口的元素弹出,直到 p u s h push push 元素的数值小于等于队列入口元素的数值为止

java实现的代码如下:

//自定义单调队列
class Myqueue {
    Deque<Integer> deque = new LinkedList<>();

    // 窗口移除的元素 value 等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
    void poll(int a) {
        if (!deque.isEmpty() && a == deque.peek()) {
            deque.poll();
        }
    }

    // 如果 add 的元素 value 大于入口元素的数值,那么就将队列入口的元素弹出,直到 add 元素的数值小于等于队列入口元素的数值为止
    void add(int value) {
        while (!deque.isEmpty() && value > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(value);
    }

     返回队列最大值
    int peek() {
        return deque.peek();
    }
}

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int length = nums.length;
        if (length == 1)
            return nums;
        // 记录最后输出的数组长度
        int l = length - k + 1;
        int[] zu = new int[l];
        Myqueue queue = new Myqueue();
        for (int i = 0; i < k; i++) {
            queue.add(nums[i]);
        }
        int count = 0;
        zu[count++] = queue.peek();
        for (int i = k; i < length; i++) {
            queue.poll(nums[i - k]);
            queue.add(nums[i]);
            zu[count++] = queue.peek();
        }
        return zu;
    }
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( k ) O(k) O(k)



Topic2前 K K K 个高频元素

题目:给你一个整数数组 n u m s nums nums 和一个整数 k k k ,请你返回其中出现频率前 k k k 高的元素。你可以按任意顺序返回答案。

示例
输入: n u m s = [ 1 , 1 , 1 , 2 , 2 , 3 ] , k = 2 nums = [1,1,1,2,2,3], k = 2 nums=[1,1,1,2,2,3],k=2
输出: [ 1 , 2 ] [1,2] [1,2]

思路:

  • 要统计元素出现频率-----> M a p Map Map 实现
  • 对频率排序----->优先级序列
  • 找出前K个高频元素
    请添加图片描述

java实现的代码如下:

/*Comparator接口说明:
 * 返回负数,形参中第一个参数排在前面;返回正数,形参中第二个参数排在前面
 * 对于队列:排在前面意味着往队头靠
 * 对于堆(使用PriorityQueue实现):从队头到队尾按从小到大排就是最小堆(小顶堆),
 *                                从队头到队尾按从大到小排就是最大堆(大顶堆)--->队头元素相当于堆的根节点
 * */
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        //key为数组元素值,val为对应出现次数
        Map<Integer,Integer> map=new HashMap<>();
        for( int num:nums){
            //计算数字出现的频率
            map.put(num,map.getOrDefault(num,0)+1);
        }
        //出现次数按从队头到队尾的顺序是从小到大排,出现次数最低的在队头(相当于小顶堆)
        PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){//小顶堆只需要维持k个元素有序
            if(pq.size()<k){//小顶堆元素个数小于k个时直接加
                pq.add(new int[]{entry.getKey(),entry.getValue()});
            }else{
                if(entry.getValue()>pq.peek()[1]){//当前元素出现次数大于小顶堆的根结点(这k个元素中出现次数最少的那个)
                    pq.poll();//弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了
                    pq.add(new int[]{entry.getKey(),entry.getValue()});
                }
            }
        }
        int[] tem=new int[k];
        for(int i=k-1;i>-1;i--){
            tem[i]=pq.poll()[0];
        }
        return tem;
    }
}

这上面的代码不熟悉
时间复杂度: O ( n   l o g k ) O(n\ logk) O(n logk)
空间复杂度: O ( n ) O(n) O(n)



Topic3栈和队列总结:

1.栈里面的元素在内存中是连续分布的么?

  • 陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。
  • 陷阱2:缺省情况下,默认底层容器是 d e q u e deque deque,那么 d e q u e deque deque 在内存中的数据分布是什么样的呢? 答案是:不连续的。

2.递归的实现是栈: 每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。

3.栈和队列的应用:
栈:1.括号匹配;2.字符串去重;3.逆波兰表达式
队列:1.滑动窗口最大值;2.求前K个高频元素

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深圳市萨科微半导体有限公司一直研究新材料新工艺,不断推出新产品,驱动公司不断发展

深圳市萨科微半导体有限公司一直研究新材料新工艺&#xff0c;不断推出新产品&#xff0c;驱动公司不断发展。最近萨科微推出SL40T120FL系列IGBT单管&#xff0c;和CMOS运算放大器SLA333等产品&#xff0c;为新能源汽车、太阳能光伏、交流电机、变频器、开关电源和工业伺服器行…

如何应对IT服务交付中的问题?看了本文DevOps就懂了

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

Java常用类库:Math类

在Java编程语言中&#xff0c;java.lang.Math类提供了一系列用于执行基本数学运算的静态方法。这些方法允许你执行各种数学计算&#xff0c;如三角函数、指数函数、对数函数、取整函数等。在本教程中&#xff0c;我们将介绍Math类的常用方法及其用法。 常用方法 以下是Math类…

线性代数 --- 特征值与特征向量

特征值与特征向量 已知任意向量x&#xff0c;现有矩阵A对x进行操作后&#xff0c;得到新的向量Ax。这就好比是自变量x与函数f(x)的关系一样&#xff0c;向量x通过类似“函数”的处理得到了一个新的向量Ax。这个新的向量可能和原向量x方向相同&#xff0c;也可能不同(事实上大多…

1911_野火FreeRTOS教程阅读笔记_请求任务切换

1911_野火FreeRTOS教程阅读笔记_请求任务切换 全部学习汇总&#xff1a; g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 还有一部分任务切换请求的代码没有分析。 实现上是一个宏定义&#xff0c;实现的工作主要的核心点还是请求PendSV的exception。当这个调用的时候&#xff0c;下…

基于AM62X+FPGA/MCU的B码对时定制化整机解决方案

什么是IRIG-B码对时 IRIG-B(inter-range instrumentationgroup-B)码是一种时间同步标准&#xff0c;通常用于精确的时间测量和数据同步&#xff0c;广泛应用于电力、通信、航空等领域。 IRIG-B码为每秒一帧的时间串码&#xff0c;一帧串码中包含100个码元&#xff0c;频率为1K…

STM32控制气泵和电磁阀实现

一、功能简介 使用STM32控制气泵和电磁阀的开和关&#xff0c;气泵和电磁阀的供电电压为12V。 二、实现过程 1、气泵和电磁阀的开和关均为开关量&#xff0c;实现控制方法有多种&#xff0c;比如继电器&#xff0c;但是继电器动作有噪声且体积较大&#xff0c;更好的方法为使…

【YARN】详解 YARN 中的 ResourceManager

详解 YARN 中的 ResourceManager 1.ResourceManager 核心功能2.通信&#xff08;与三个角色通信&#xff09;3.模块简介3.1 用户交互模块3.2 NM 管理模块3.3 AM 管理模块3.4 Application 管理模块3.5 状态机模块3.6 安全模块3.7 资源分配模块 4.模块详解​​4.1 用户交互模块4.…

如何使用ArcGIS Pro进行坡度分析

坡度分析是地理信息系统中一种常见的空间分析方法&#xff0c;用于计算地表或地形的坡度&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro进行坡度分析&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&…

一般情况下使用耳机壳UV树脂制作耳机壳的成本是多少?

一般情况下使用耳机壳UV树脂制作耳机壳的成本是多少&#xff1f; 使用耳机壳UV树脂制作耳机壳的成本主要包括材料成本、加工成本和其他附加成本。 材料成本主要取决于所采购的UV树脂的数量和单价。如果购买数量较大&#xff0c;单价可能会较低。市场上不同品牌和型号的UV树脂…

ubuntu 20.04 安装 huggingface transformers 环境

1. 安装 cuda 大多数新发布的大语言模型使用了较新的 PyTorch v2.0 版本&#xff0c;Pytorch 官方认为 CUDA 最低版本是 11.8 以及匹配的 GPU 驱动版本。详情见Pytorch官方 如下图&#xff1a; 1.1 下载 cuda cuda 12.1 官方网站&#xff1a; 下载&#xff1a; $wget htt…

部署LVS负载均衡架构

目录 一、ipvsadm 工具 二、NAT模式下部署LVS负载均衡 1、部署NFS共享存储服务器 1.1 安装NFS软件 1.2 新建共享目录和站点文件 1.3 设置共享策略 2、部署节点服务器1 2.1 安装并启动nginx软件 2.2 挂载共享目录到网页站点目录 2.3 修改网关 3、部署节点服务器2 3.…

【网络应用层协议】【MQTT】详解消息队列遥测传输协议MQTT(超详细)

目录 1. MQTT 协议简介 2. MQTT 的特点 3. MQTT 协议原理 4. MQTT协议中的订阅、主题、会话 1. MQTT 协议简介 MQTT&#xff08; Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议 &#xff09;是一种消息列队传输协议&#xff0c;采用订阅、发布机制&…

coqui-ai/TTS 案例model文件

GitHub - coqui-ai/TTS: &#x1f438;&#x1f4ac; - a deep learning toolkit for Text-to-Speech, battle-tested in research and production Coqui AI的TTS是一款开源深度学习文本转语音工具&#xff0c;以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&…

递增三元组(第九届蓝桥杯)

文章目录 题目原题链接思路分析二分做法1二分做法2双指针做法前缀和解法 题目 原题链接 递增三元组 思路分析 由时间复杂度可知需要至少优化到 O ( n l o g n ) O(nlogn) O(nlogn)才行 而纯暴力枚举三个数组的话&#xff1a; O ( n 3 ) O(n^3) O(n3) 可以考虑将b[]作为标志&…

onlyoffice监听https

修改onlyoffice 在开始将您的ONLYOFFICE Docs切换到HTTPS协议之前&#xff0c;您需要创建一个安全证书和证书私钥。将它们放到安装ONLYOFFICE Docs的计算机上的一个文件夹中。 获得证书后&#xff0c;请执行以下步骤&#xff1a; 所有命令都应以管理员权限执行。要以管理员身份…

【HTML】HTML基础7.3(自定义列表)

目录 标签 效果 代码 注意 标签 <dl> <dt>自定义标题</dt><dd>内容1</dd><dd>内容2</dd><dd>内容3</dd> 。。。。。。 </dl> 效果 代码 <dl><dt>蜘蛛侠系列</dt><dd>蜘蛛侠1</dd…

如何远程连接服务?

"天联"是一种远程连接服务&#xff0c;可以实现异地统一管理、随时随地协同办公和远程数据采集管理等功能。 1. 零售、收银软件应用实现异地统一管理 在医药、餐饮、商超等零售行业中&#xff0c;经常需要对分布在不同地点的店铺进行管理。"天联"提供了远…

计算机组成原理-微程序控制器实验——沐雨先生

一、实验目的 1.掌握微程序控制器的组成原理和工作过程。 2.理解微指令和微程序的概念,理解微指令与指令的区别与联系。 3.掌握指令操作码与控制存储器中微程序的对应方法&#xff0c;熟悉根据指令操作码从控制存储器中读出微程序的过程。 二、实验要求 1.做好实验预习&am…

《教育知识与能力》中教师资格证笔试黄金卷(二)

1&#xff0e;古希腊古典时代教育中&#xff0c;以雄辩和与青年智者的问答法而著名的教育家是&#xff08;A &#xff09;。 A&#xff0e;苏格拉底 B&#xff0e;柏拉图C&#xff0e;亚里士多德D&#xff0e;昆体良 2&#xff0e;世界上不同民族的教育往往表现出不同的传统和特…