力扣哈哈哈哈

public class MyStack {
    int top;
    Queue<Integer> q1;
    Queue<Integer> q2;
    public MyStack() {
        q1=new LinkedList<Integer>();
        q2=new LinkedList<Integer>();
    }

    public void push(int x) {
        q2.offer(x);//offer是入队方法
        while (!q1.isEmpty()){
            q2.offer(q1.poll());//poll是出队方法
        }
        Queue<Integer> temp;
        temp=q1;
        q1=q2;
        q2=temp;
    }

    public int pop() {
        return q1.poll();
    }

    public int top() {
        return q1.peek();//peek用于检索但不移除队列的头部元素
    }

    public boolean empty() {
        return q1.isEmpty();
    }
}

public class MyQueue {
    Deque<Integer> inStack;
    Deque<Integer> outStack;
    public MyQueue() {
        inStack=new ArrayDeque<Integer>();
        outStack=new ArrayDeque<Integer>();
    }

    public void push(int x) {
        inStack.push(x);
    }

    public int pop() {
        if(outStack.isEmpty()){
            intooutStack();
        }
        return outStack.pop();
    }

    public int peek() {
        if(outStack.isEmpty()){
            intooutStack();
        }
        return outStack.peek();
    }

    public boolean empty() {
        return inStack.isEmpty()&&outStack.isEmpty();
    }

    private void intooutStack(){
        while (!inStack.isEmpty()){
            outStack.push(inStack.pop());
        }
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

构造函数 MyQueue(): 初始化了两个栈 inStack 和 outStack,分别用于入队和出队操作。

push(int x) 方法: 将元素 x 入队。直接将元素 x 压入 inStack 栈顶。

pop() 方法: 出队操作,返回队列的头部元素并将其移除。首先检查 outStack 是否为空,如果为空,则调用 intooutStack() 方法将 inStack 中的元素逐个弹出并压入 outStack,然后从 outStack 中弹出一个元素作为出队元素。

peek() 方法: 返回队列的头部元素,但不移除。同样,首先检查 outStack 是否为空,如果为空,则调用 intooutStack() 方法将 inStack 中的元素逐个弹出并压入 outStack,然后返回 outStack 栈顶元素。

empty() 方法: 检查队列是否为空。如果 inStack 和 outStack 都为空,则队列为空。

intooutStack() 方法: 将 inStack 中的元素逐个弹出并压入 outStack。这个方法在执行出队操作时会被调用,确保 outStack 中的元素顺序符合队列的先进先出特性。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {
            public int compare(int[] pair1, int[] pair2) {
                return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
            }
        });
        for (int i = 0; i < k; ++i) {
            pq.offer(new int[]{nums[i], i});
        }
        int[] ans = new int[n - k + 1];
        ans[0] = pq.peek()[0];
        for (int i = k; i < n; ++i) {
            pq.offer(new int[]{nums[i], i});
            while (pq.peek()[1] <= i - k) {
                pq.poll();
            }
            ans[i - k + 1] = pq.peek()[0];
        }
        return ans;
    }
}

PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {
            public int compare(int[] pair1, int[] pair2) {
                return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
            }
        });

这段代码创建了一个优先队列 pq,其中存储了整数数组 int[]。在构造优先队列时,通过传入一个自定义的比较器 Comparator<int[]> 来指定元素的比较规则。

比较器中的 compare() 方法定义了元素的比较逻辑。在这个比较器中,首先比较两个元素的第一个元素 pair1[0] 和 pair2[0],如果它们不相等,则按照元素的第一个值从大到小排序,即返回 pair2[0] - pair1[0]。如果第一个元素相等,则继续比较第二个元素 pair1[1] 和 pair2[1],按照第二个元素从大到小排序,即返回 pair2[1] - pair1[1]。

这样定义的比较器保证了优先队列中的元素按照其第一个值从大到小排序,如果第一个值相等,则按照第二个值从大到小排序。这种排序方式可以确保优先队列中的头部元素始终是具有最大值的元素对 [nums[i], i]。

pq.offer(new int[]{nums[i], i});
ChatGPT
在这行代码中,pq.offer(new int[]{nums[i], i}),我们创建了一个整数数组 new int[]{nums[i], i},其中 nums[i] 是当前元素的值,i 是当前元素的索引。然后,我们使用 pq.offer() 方法将这个数组作为一个元素添加到优先队列 pq 中。

这样,每个元素都以 [nums[i], i] 的形式存储在优先队列中,从而实现了按照元素值及其对应的索引进行排序。

对于这行代码 pq.peek()[1] <= i - k,它是在检查当前优先队列头部元素的索引是否小于等于 i - k,如果是,则表示该元素不在当前窗口内。让我来解释一下这行代码的作用:

  • pq.peek():这会返回优先队列 pq 的头部元素,即具有最高优先级的元素,由于我们在构造优先队列时使用了自定义的比较器,头部元素是具有最大值的元素对 [nums[i], i]
  • pq.peek()[1]:这会返回头部元素的索引部分,即 i,这是因为我们将元素对 [nums[i], i] 存入优先队列中,第二个值是元素的索引。
  • i - k:这表示当前窗口的左边界,即当前索引 i 减去窗口的大小 k,这是为了确定当前窗口的范围。

所以,pq.peek()[1] <= i - k 的意思是,如果当前优先队列头部元素的索引小于等于当前窗口的左边界,即头部元素不在当前窗口内,那么我们需要将该元素从队列中弹出。

PriorityQueue 是 Java 中提供的一种优先队列的实现,它是一种特殊的队列,其中的元素被赋予了优先级。在 PriorityQueue 中,元素按照它们的自然顺序或者根据特定的 Comparator 接口进行排序。

  • 当不提供自定义的比较器时,PriorityQueue 将使用元素的自然顺序进行排序。例如,如果队列存储的是整数,则队列将按照整数的大小进行排序,从小到大排列。
  • 当提供了自定义的比较器时,PriorityQueue 将根据指定的比较规则对元素进行排序。

在这段代码中,我们使用了一个自定义的比较器,通过比较元素对 [nums[i], i] 中的第一个值(元素值)来进行排序。如果元素值不相等,则按照元素值从大到小排序;如果元素值相等,则按照第二个值(元素索引)从大到小排序。这样,优先队列中的头部元素始终是具有最大值的元素对 [nums[i], i],从而实现了按照元素值及其对应的索引进行排序。

这段代码是标准的解法,它使用优先队列来解决滑动窗口最大值的问题。让我来逐步解释它的实现:

  1. 初始化

    • 创建了一个优先队列 pq,用于存储当前窗口内的元素,并按照元素值从大到小排序,如果元素值相等,则按照索引从大到小排序。
    • 使用一个循环遍历数组 nums 的前 k 个元素,将它们作为初始窗口,并加入优先队列 pq 中。
  2. 计算窗口最大值

    • 初始化一个长度为 n - k + 1 的数组 ans,用于存储每个窗口的最大值。
    • 将第一个窗口的最大值(即优先队列的头部元素的值)存入 ans 数组的第一个位置。
    • 从第 k 个元素开始遍历数组 nums,并将每个元素加入到优先队列 pq 中。
    • 对于每个窗口:
      • 如果当前优先队列头部元素的索引小于等于 i - k,表示该元素不在当前窗口内,需要将其从队列中弹出。
      • 将当前窗口的最大值存入 ans 数组中。
  3. 返回结果

    • 返回 ans 数组,其中存储了每个窗口的最大值。

这种实现方式利用了优先队列的特性,实现了对滑动窗口内的元素进行快速查找最大值的功能。

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

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

相关文章

如何通过Postgres的日志进行故障排查?

文章目录 一、配置日志记录二、查看和分析日志三、使用日志进行故障排查的示例四、总结 在进行数据库管理和维护时&#xff0c;日志分析是一项至关重要的技能。PostgreSQL的日志记录功能可以帮助我们追踪数据库的运行状态&#xff0c;定位问题&#xff0c;以及优化性能。下面&a…

51单片机入门_江协科技_33~34_OB记录的自学笔记_LED呼吸灯与PWM直流马达调速

33. 直流电机驱动(PWM) 33.1. 直流电机介绍 •直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 •直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&…

如何规划数据中台

1. 数据中台是一套解决方案 数据中台是一套可持续“让企业数据用起来”的机制&#xff0c;是一套解决方案&#xff0c;不仅是一个平台。让数据更加灵活地支撑前端业务&#xff0c;通过持续沉淀企业数据复用能力形成数据从采集、治理、开发到数据服务的一整套数据使用的机制。 …

SpringBoot 监控 SQL 运行情况(实战教程)

1 基本概念 2 添加依赖 3 配置相关属性 4 sql监控 5 慢sql记录 6 spring 监控 7 去 Ad&#xff08;广告&#xff09; 8 获取 Druid 的监控数据 1 基本概念 Druid是Java语言中最好的数据库连接池。 虽然HikariCP的速度稍快&#xff0c;但是&#xff0c;Druid能够提供强…

【考研高数】学习笔记分享

派大星说数学&#xff08;导学部分&#xff09; 关于做题 测试 答疑阶段 直播 群内 高中基础知识导学 一、数与式 述了课程学习和因式分解、分式拆解等知识点。学生应了解课程内容&#xff0c;带着疑问听课&#xff0c;不要抄笔记&#xff0c;导学课和基础课都有测验&…

mac安装nvm详细教程

0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…

鼠标悬停显示三个下拉列表按钮

鼠标悬停显示三个下拉列表按钮 代码部分&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scala…

京东AI数字人“采销东哥”首秀观看量破2000万;天工 SkyMusic 音乐大模型开放公测

&#x1f989; AI新闻 &#x1f680; 京东AI数字人“采销东哥”首秀观看量破2000万 摘要&#xff1a;京东AI数字人“采销东哥”由京东云言犀打造&#xff0c;在其直播首秀中亮相并迅速吸引超2000万观看量。尽管“采销东哥”的外形和口音与创始人刘强东相似&#xff0c;但其直…

SSL Pinning之双向认证

双向认证处理流程 概述获取证书逆向app 获取证书的KeyStore的 key通过jadx 反编译 app 获取证书&#xff1a;frida hook 证书转换命令行转换portecle 工具使用 charles 配置 p12 格式证书 概述 本篇只介绍怎么解决ssl pinning&#xff0c; 不讲ssl/tls 原理。 为了解决ssl pinn…

运动想象 (MI) 分类学习系列 (8) :IFNet

运动想象分类学习系列:IFNet 0. 引言1. 主要贡献2. 提出的方法2.1 交互式频率卷积神经网络2.1.1 光谱空间特征表示2.1.2 跨频交互2.1.3 分类&#xff08;一个池化分类层&#xff09; 2.2 重复试验增强 3. 实验3.1 基线比较3.2 消融实验3.2.1 数据增强消融3.2.2 条带分割消融3.2…

✅技术社区--布隆过滤器在项目中怎么用的?不用可以吗?

使用 布隆过滤器 一般就是用于快速判断某个元素是否在集合中出现了&#xff0c;可以用于解决 缓存穿透 的问题&#xff0c;布隆过滤器提供 一组哈希函数 h1, h2, ..., hk &#xff0c;对需要存储的数据使用哈希函数计算得到 k 个哈希值&#xff0c;将 BitMap 中这 k 个位置都设…

面试stm32基础知识

1.ISP 第一步进入bootloader模式&#xff1a;先置BOOT0为高&#xff0c;BOOT1为低&#xff0c;再复位单片机进入bootloader模式&#xff0c;之后通过上位机下载程序&#xff1b; 第二步配置启动代码的地方&#xff1a;代码下载完毕后&#xff0c;置BOOT0为低&#xff0c;BOOT1…

中兴F7607P自启动程序,关闭JAVA插件

本文目的&#xff1a;关闭光猫内自动运行的JAVA插件&#xff0c;并实现开机自动调用用户的程序启动 移动定制版F7607P不带LXC容器&#xff0c;取而代之的是JAVA虚拟机&#xff0c;内置多个插件&#xff0c;包括名为CMCCDPI的插件&#xff0c;用途可以从名字上窥见。机器rootfs分…

Windows系统下查看C语言文件反汇编

一、配置编译器环境变量 1.下载mingw64 MinGW 的全称是&#xff1a;Minimalist GNU on Windows &#xff0c;MinGW 就是 GCC 的 Windows 版本 。 MinGW-w64 与 MinGW 的区别在于 MinGW 只能编译生成32位可执行程序&#xff0c;而 MinGW-w64 则可以编译生成 64位 或 32位 可执行…

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程&#xff1a; VMware 安装配置 Ubuntu&#xff08;最新版、超详细&#xff09;FinalShell 远程连接 Linux&#xff08;Ubuntu&#xff09;系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题&#xff1a;为什么使用 FinalShell 连接&#xff0…

字符串拆分优化算法

字符串拆分优化算法 问题背景算法设计思路伪代码实现C语言代码实现 详细解释结论 在面对字符串拆分问题时&#xff0c;我们的目标是找到一种最优的拆分顺序&#xff0c;以使得总的拆分代价最小。这个问题可以通过动态规划算法来解决。在本文中&#xff0c;我们将详细介绍这个问…

通过本机电脑远程访问路由器loopback的ip

实验拓扑图 本机电脑增加路由信息 正常设置telnet用户&#xff0c;然后通过本地电脑telnet 软件ensp中的设备&#xff0c;尝试是否可以正常访问即可 测试通过本地电脑可以正常访问ensp里面设备的loopback的ip地址了 最重要的一点是本机需要增加一条路由route add ip mask 下…

python数据可视化:折线图plt.plot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 折线图 plt.plot() 选择题 关于以下代码输出的结果说法正确的是&#xff1f; import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans…

2011年认证杯SPSSPRO杯数学建模C题(第二阶段)你的爱车入保险了吗全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 C题 你的爱车入保险了吗 原题再现&#xff1a; 近几年&#xff0c;国内汽车销售市场异常火爆&#xff0c;销售量屡创新高。车轮上的世界&#xff0c;保险已经与我们如影随形。汽车保险&#xff0c;简称车险&#xff0c;是指对机动车辆由于自然…

排序(四)——归并排序 + 外排序

目录 1.归并排序递归实现 代码 2.归并排序非递归 代码 3.比较快排、归并和堆排序 4.归并排序实现外排序 1.归并排序递归实现 我们之前对两个有序数组进行排序就用到了归并的思想&#xff0c;对于两个有序数组&#xff0c;我们分别取他们首元素比较大小&#xff0c;取小的插…
最新文章