代码学习记录11

随想录日记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个高频元素

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

结构体详解

结构体 什么是结构体 结构体是一种用户自定义的数据类型&#xff0c;可以组合多个相关值成为一个单一类型。它是由一批数据组合而成的结构型数据&#xff0c;结构体可以包含多个不同类型的字段&#xff0c;如基本数据类型、其他结构体、枚举类型等。在Rust中&#xff0c;结构…

Ubantu 18.04 配置固定IP

1.首先在终端里输入命令,将你的网关和ip&#xff0c;记下来 ifconfig 2. 执行命令&#xff1a; sudo gedit /etc/network/interfaces 3.在弹出来的框里输入 auto后面的就是网关&#xff0c;address是你虚拟机的ip&#xff0c;gateway是你的网关ip&#xff0c;netmask是你的子…

Python从0到100(二):Python语言介绍及第一个Pyhon程序

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

如何通过抖捧轻松开启AI常态化自动直播间

在如今的互联网时代&#xff0c;短视频和直播已成为大多数企业与实体商家必备的经营技能&#xff0c;不只是全国头部的品牌&#xff0c;他们纷纷加码直播&#xff0c;更有一些已经开启了直播矩阵的体系&#xff0c;包括中小型的商家&#xff0c;他们也在考虑一件事情&#xff0…

前端接收流,并下载到本地

碰到一个大坑&#xff0c;附件文件存在华为云上&#xff0c;查询列表里记录的附件给了一个https开头的url&#xff0c;要求点击附件图标&#xff0c;下载附件到本地&#xff0c; 思路1.直接<a hrefurl downloadfileName >下载</a> 实际效果&#xff1a;跨域下载不…

Java批量修改文件目录名称(树行结构、批量重命名)

Java批量修改文件目录名称(树行结构、批量重命名) 1.读取某个路径的文件目录结构 2.递归批量修改目录文件前缀进行递增 3.结果截图 4.代码 package com.zfi.server.device;import java.io.File; import java.util.Arrays; import java.util.Comparator;public class FileTest…

【ArcPy】游标访问几何数据

访问质心坐标相关数据 结果展示 代码 import arcpy shppath r"C:\Users\admin\Desktop\excelfile\a2.shp" with arcpy.da.SearchCursor(shppath, ["SHAPE","SHAPEXY","SHAPETRUECENTROID","SHAPEX","SHAPEY",&q…

2024抖店全新教程,关于选品和对接达人的流程,细节分享如下

我是王路飞。 对做无货源抖店的商家来说&#xff0c;如何找到一个好的产品&#xff0c;并且把它卖出去&#xff0c;非常重要。 因此&#xff0c;商家的选品能力、达人资源的对接&#xff0c;就很关键了。 今天给你们聊下2024年做抖店&#xff0c;如何选品并且对接到靠谱的带…

MySQL王国:从基础到高级的完整指南【文末送书-28】

文章目录 MySQL从入门到精通第一部分&#xff1a;MySQL基础第二部分&#xff1a;MySQL进阶第三部分&#xff1a;MySQL高级应用 MySQL从入门到精通&#xff08;第3版&#xff09;&#xff08;软件开发视频大讲堂&#xff09;【文末送书-28】 MySQL从入门到精通 MySQL是一种开源…

记录开发过程中遇到的oracle 分页问题

问题: oracle 分页查询,因为是相对来说比较复杂的sql,一直以为是union all 的问题. 结果是相同时间相同,order by 时间之后 、分页查询的每次结果都不能保证与自己直接查询的不分页数据保持一致、导致有些数据看不到 解决方案: order by 条件最后添加一个表中不会重复的字段比如…

复合机器人上下料方案:从设计到实施的全过程

随着智能制造和工业自动化的快速发展&#xff0c;复合机器人上下料方案已成为提高生产效率、降低人力成本的关键技术。 方案设计 1、需求分析&#xff1a;首先&#xff0c;需要对生产线的上下料需求进行深入分析&#xff0c;包括物料种类、尺寸、重量、上下料频率等&#xff…

八大技术架构演进之路【小林优选,呕心沥血】

概述 在进行技术学习过程中&#xff0c;由于大部分读者没有经历过一些中大型系统的实际经验&#xff0c; 导致无法从全局理解一些概念&#xff0c;所以本文以一个 "电子商务" 应用为例&#xff0c;介绍从一百个 到千万级并发情况下服务端的架构的演进过程&#xff0c…

三级分销数据库设计

一&#xff0c;数据结构 二&#xff0c;查询方法 1.mysql递归查询 获取id9的所有上级 r : 9 设置自己所要搜索子节点的id SELECTT2.* FROM(SELECTr AS _id,( SELECT r : pid FROM sj_user WHERE id _id ) AS 2v2,l : l 1 AS lvl FROM( SELECT r : 9 ) vars, -- 查询id为…

MS2351M——RF 检测器/控制器

产品简述 MS2351M 是一款对数放大器芯片&#xff0c;主要用于接收信号强度 指示 RSSI 与功率放大器控制&#xff0c;工作频率范围是 50M  3000MHz &#xff0c; 因频率与温度不同&#xff0c;动态范围达 35dB 到 45dB 。 MS2351M 是电压响应器件&#xff0c; 50M…

哪些大型国企会储备GIS开发工程师?

随着数字化技术的不断发展和国家对数字化转型的重视&#xff0c;国企作为国民经济的中坚力量&#xff0c;开始走在数字化转型的前列。 许多国企&#xff0c;已经将数字化转型作为企业发展的重点战路&#xff0c;希望通过数字化技术的应用&#xff0c;推动企业的业务模式、管理…

Java8的Stream执行机制

Java8的Stream执行机制 Stream的概念解说Stream的概念解说-Stream的含义Stream的概念解说-现实类比Stream的概念解说-Stream中的概念Stream的执行机制Stream的执行机制-最直接的流水线实现方式Stream的执行机制-for循环也能干的事Stream的执行机制-基本类图Stream的执行机制-记…

短视频矩阵系统--抖去推---年后技术还能迭代更新开发运营吗?

短视频矩阵系统#短视频矩阵系统已经开发3年&#xff0c;年后这个市场还能继续搞吗&#xff1f;目前市面上开发短视频账号矩阵系统的源头公司已经不多了吧&#xff0c;或者说都已经被市场被官方平台的政策影响的不做了吧&#xff0c;做了3年多的矩阵系统开发到现在真的是心里没有…

Vue2:路由history模式的项目部署后页面刷新404问题处理

一、问题描述 我们把Vue项目的路由模式&#xff0c;设置成history 然后&#xff0c;build 并把dist中的代码部署到nodeexpress服务中 访问页面后&#xff0c;刷新页面报404问题 二、原因分析 server.js文件 会发现&#xff0c;文件中配置的路径没有Vue项目中对应的路径 所以…

python报名人数 2023年9月青少年编程电子学会python编程等级考试二级真题解析

目录 python报名人数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python报名人数 2023年9月 python编程等级考试级编程题 一、题目要求 1…

20240301-1-ZooKeeper面试题(一)

1. ZooKeeper 面试题&#xff1f; ZooKeeper 是一个开放源码的分布式协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff0c;将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应…