队列——算法专项刷题(七)

news2025/1/20 22:39:42

七、队列

常用于辅助遍历树,设计队列先进先出特性的数据结构

7.1 滑动窗口的平均值

给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。

实现 MovingAverage 类:

  • MovingAverage(int size) 用窗口大小 size 初始化对象。

  • double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数,请计算并返回数据流中最后 size 个值的移动平均值,即滑动窗口里所有数字的平均值。

示例:

输入:
inputs = [“MovingAverage”, “next”, “next”, “next”, “next”]
inputs = [[3], [1], [10], [3], [5]]
输出:
[null, 1.0, 5.5, 4.66667, 6.0]

解释:

  • MovingAverage movingAverage = new MovingAverage(3);
  • movingAverage.next(1); // 返回 1.0 = 1 / 1
  • movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
  • movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
  • movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3

提示:

  • 1 <= size <= 1000
  • -105 <= val <= 105
  • 最多调用 next 方法 104

思路: 使用队列 定义一个size表示队列最大元素个数,如果在添加元素时,队列元素个数等于size,就出队一个元素,再添加。维护一个sum,记录队列中元素和

注意点: sum最好直接定义为浮点类型

class MovingAverage {

    Queue<Integer> queue;
    int size;
    double sum;

    /**
     * Initialize your data structure here.
     */
    public MovingAverage(int size) {
        queue = new LinkedList<>();
        this.size = size;
        sum = 0.0;

    }

    public double next(int val) {

        if(queue.size() == size){
            sum = sum - queue.poll();
        }
        
        queue.offer(val);
            sum += val;

        return sum / queue.size();

    }
}

7.2 最近请求次数

原题链接

写一个 RecentCounter 类来计算特定时间范围内最近的请求。

请实现 RecentCounter 类:

  • RecentCounter() 初始化计数器,请求数为 0 。

  • int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在[t-3000, t]内发生的请求数。

保证 每次对 ping 的调用都使用比之前更大的 t 值。

示例:

输入:
inputs = [“RecentCounter”, “ping”, “ping”, “ping”, “ping”]
inputs = [[], [1], [100], [3001], [3002]]
输出:
[null, 1, 2, 3, 3]

解释:

  • RecentCounter recentCounter = new RecentCounter();
  • recentCounter.ping(1); // requests = [1],范围是 [-2999,1],返回 1
  • recentCounter.ping(100); // requests = [1, 100],范围是 [-2900,100],返回 2
  • recentCounter.ping(3001); // requests = [1, 100, 3001],范围是 [1,3001],返回 3
  • recentCounter.ping(3002); // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3

提示:

  • 1 <= t <= 109
  • 保证每次对 ping 调用所使用的 t 值都 严格递增
  • 至多调用 ping 方法 104

思路: 使用队列数据结构,在ping时先将不符合的条件的值出队,然后返回队列元素个数即为符合条件的

注意点:

class RecentCounter {

    Queue<Integer> queue;

    public RecentCounter() {
        queue = new ArrayDeque<>();
    }

    public int ping(int t) {
  int num = t - 3000;
  while(!queue.isEmpty() && queue.peek() < num){
      queue.poll();
  }
  queue.offer(t);
        
  return queue.size();
        
    }
}

7.3往完全二叉树添加结点

完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大,第 n 层有 2n-1 个节点)的,并且所有的节点都尽可能地集中在左侧。

设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作:

  • CBTInserter(TreeNode root) 使用根节点为 root 的给定树初始化该数据结构;

  • CBTInserter.insert(int v) 向树中插入一个新节点,节点类型为 TreeNode,值为 v 。使树保持完全二叉树的状态,并返回插入的新节点的父节点的值

  • CBTInserter.get_root() 将返回树的根节点。

示例 1:

  • 输入:inputs = [“CBTInserter”,“insert”,“get_root”], inputs = [[[1]],[2],[]]

  • 输出:[null,1,[1,2]]

提示:

  • 最初给定的树是完全二叉树,且包含 1 到 1000 个节点。

  • 每个测试用例最多调用 CBTInserter.insert 操作 10000 次。

  • 给定节点或插入节点的每个值都在 0 到 5000 之间。

思路: 通过辅助队列层序遍历,将所有结点放入list集合中。由于完全二叉树的特性,若父节点序号为i,那么子节点序号为 2i,2i+1,因此我们通过list集合size /2 -1 就是父节点下标(下标从0开始需要-1)

注意点:先添加子节点,然后再根据 size /2-1计算父节点下标((2i/2) -1 、 (2i+1/2)-1)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

class CBTInserter {

    List<TreeNode> list;
    Queue<TreeNode> queue;
  
    public CBTInserter(TreeNode root) {
        list = new ArrayList();
        queue = new LinkedList();
        
      
          queue.offer(root);
          
          while(!queue.isEmpty()){
               TreeNode node = queue.poll();
              list.add(node);
               if(node.left != null){
                   queue.offer(node.left);
               }
                if(node.right != null){
                   queue.offer(node.right);
               }
          }

    }

    public int insert(int v) {
    TreeNode node = new TreeNode(v);
     list.add(node);
    // 结点 个数 /2 -1 就是 父节点下标 
         TreeNode parent= list.get(list.size() / 2 - 1);
         

         if(parent.left == null){
             parent.left = node;
         }else if(parent.right == null){
             parent.right = node;
         }
         
         return parent.val;
         

    }

    public TreeNode get_root() {
  
        return list.get(0);

    }
}

7.4二叉树的右侧视图

原题链接

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

在这里插入图片描述

  • 输入: [1,2,3,null,5,null,4]
  • 输出: [1,3,4]

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

思路: 层序遍历,每一层的最后一个结点即为所求。使用队列辅助层序遍历,维护一个count记录每层结点的个数,如果为0,就表示当前结点就是每一层最后一个结点,并使用队列长度更细count

注意点: count为每层的结点个数,并非队列中的节点个数,只有当一层遍历结束的时候,count为0才会使用队列长度更新count

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> rightSideView(TreeNode root) {

        Queue<TreeNode> queue = new LinkedList();
        List<Integer> list = new ArrayList();

        if(root == null) return list;

        int count = 1;
        queue.add(root);
        while (!queue.isEmpty()){
             TreeNode node = queue.poll();
             count--;
             
             if(node.left != null){
                 queue.offer(node.left);
                
             }
             if(node.right != null){
                 queue.offer(node.right);
                
             }
             if(count == 0){
                 // 遍历完一层 更新count 并记录最后一个结点
                 list.add(node.val);
                 count = queue.size();
             }

        }
        
        return list;



    }
}

7.5二叉树每层的最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

  • 输入: root = [1,3,2,5,3,null,9]

  • 输出: [1,3,9]

  • 解释:

    ​ 1

    ​ / \

    ​ 3 2

    ​ / \ \

    ​ 5 3 9

提示:

  • 二叉树的节点个数的范围是 [0,104]
  • -231 <= Node.val <= 231 - 1

思路: 二叉树层序遍历,维护一个count记录每层结点个数,遍历每层时,一直更新max,在每层遍历结束,添加max,重置max和count

注意点: max在count为0就是每层遍历结束后要重新置为 最小值

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> largestValues(TreeNode root) {

  Queue<TreeNode> queue = new LinkedList();

  List<Integer> list = new ArrayList();
  if(root == null) return list;
  queue.offer(root);
  // 表示每层元素
     int count = 1;
     int max = Integer.MIN_VALUE;
       
       while(!queue.isEmpty()){
       
           TreeNode node =  queue.poll();
              count--;

              max = Math.max(max,node.val);

              if(node.left != null){
                  queue.offer(node.left);
              }
              if(node.right != null){
                  queue.offer(node.right);
              }
              if(count == 0){
                  // 加入每层最大值
                  list.add(max);
                  // 重置 max 和 count
                  max = Integer.MIN_VALUE;
                  count = queue.size();
              }
           

       }

       return list;


    }
}

7.6二叉树最底层最左边的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

在这里插入图片描述

  • 输入: root = [2,1,3]
  • 输出: 1

提示:

  • 二叉树的节点个数的范围是 [1,104]
  • -231 <= Node.val <= 231 - 1

思路: 深度优先遍历,维护一个curHight记录二叉树的最大高度,在dfs的时候计算更新当前遍历的高度hight,如果hight大于curHight说明遍历到了新的一层,此时的结点就是这一层最左边的结点

注意点: 先遍历左节点

class Solution {
    int curHight = 0;
    int cur = 0;
    public int findBottomLeftValue(TreeNode root) {
       

           dfs(root,0);

           return cur;


    }

    void dfs(TreeNode node, int hight){
        if(node == null) return;
       
        // 更新高度
        hight++;
        if(hight > curHight){
            curHight = hight;
            cur = node.val;
        }

        dfs(node.left,hight);
        dfs(node.right,hight);


    }
}

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

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

相关文章

图书管理系(附源码PPT)

图书管理系统1 绪 论1.1 研究背景1.2 研究意义1.3 相关研究现状1.3.1 高校图书管理面临的问题1.3.2 信息化为图书管理带来新变化2 相关技术2.1 JSP 概述2.2 MySQL 数据库技术2.3 Spring2.4 SpringMVC2.5 Dbcp2.6 Maven3 系统分析3.1 需求分析3.1.1 系统的功能需求分析3.1.2 系统…

利用衍射表面消色差的混合目镜建模

1. 摘要 同时具有折射和衍射表面的混合透镜已成为一种极具潜力的解决方案应用于多种领域。在此案例中&#xff0c;我们将演示混合目镜的一个例子&#xff0c;其中利用衍射透镜表面对色差进行了校正。由ZemaxOpticStudio进行初始化设计&#xff0c;并导入VirtualLab Fusion进行进…

TensorRt(2)快速入门介绍

文章目录1、使用ONNX部署的示例1.1、导出模型1.2、设置batch size批处理大小1.3、指定数值精度1.4、转换模型1.5、部署模型2、使用ONNX转换为engine再部署的示例2.1、导出ONNX模型2.1.1、从TensorFlow中导出ONNX2.1.1、从PyTorch中导出ONNX2.2、ONNX 转化为 TensorRT Engine2.3…

27个超实用Chrome控制台调试技巧 Source 全局搜索(关注更新)

谷歌开发者工具提供了一系列的功能来帮助开发者高效 Debug 网页应用&#xff0c;让他们可以更快地查找和修复 bug。在谷歌的开发者工具中&#xff0c;有非常多有用的小工具&#xff0c;但是很多开发者并不知道。通过这篇文章&#xff0c;我把我常用的那些高效 Debug 的 Chrome …

ARM 汇编指令集1_2

一、两个概念&#xff1a;指令与伪指令 &#xff08;汇编&#xff09;指令&#xff0c;是 CPU 机器指令的助记符&#xff0c;经过编译后会得到一串10组成的机器码&#xff0c;可以由 CPU 读取执行。&#xff08;汇编&#xff09;伪指令&#xff0c;本质上不是指令&#xff08;…

版本控制利器——changelog

问题描述 当前&#xff0c;我们项目需要进行版本的确定&#xff0c;人工审核代码已接近尾声&#xff0c;但为了防止后续继续出现该问题&#xff0c;我希望能够做到在每次push到master时&#xff0c;更新changelog 将每一个版本的commit记录下来&#xff0c;类似于下列 解决…

K8s 集成 Jenkins 部署Go Web项目

风离不摆烂学习日志 Day9 K8s 集成 Jenkins 部署Go Web项目 Dockerfile FROM golang:alpine as builder # 需要go环境 MAINTAINER fl1906WORKDIR /work # 源 RUN go env -w GOPROXYhttps://goproxy.cn && go env -w CGO_ENABLED0 && go env -w GO111MODULEon C…

Splunk UBA 从 Ldap 成功导入 HR 数据

1: 今天在配置Splunk UBA 的HRdata 和asset data 的时候,都要用到ldap, 所以还非要装add-on:\ add-on 的名字: Splunk Supporting Add-on for Active Directory (SA-LDAPSearch) (SA-LDAPSearch) 这个add-on 的配置: Configure the Splunk Supporting Add-on for Activ…

使用腾讯云cos搭建图片服务器

背景 当我们能不希望把图片上传到自己的服务器时&#xff0c;可以采用腾讯云cos帮我们免费代图片&#xff0c;我们只需要在自己的数据库里保存一个图片地址就行了 二、注册账号免费试用 1、注册腾讯云账号 按照腾讯云的注册方式&#xff0c;注册自己的账号 2、实名认证 选择个…

blender boxCutter插件

boxCutter可以用来进行bool运算 打开boxCutter 方法1&#xff1a;物体模式在舞台左侧选择boxCutter图标 方法2&#xff1a;物体模式按N&#xff0c;在舞台右侧的侧边栏里选择boxCutter 方法3 物体模式alta 打开BoxCutter后&#xff0c;舞台上方&#xff0c;N键的弹出菜单&…

进行 Spring 6 迁移的最佳方式

介绍 在本文中&#xff0c;我们将了解如何将现有应用程序迁移到Spring 6以及如何充分利用此升级。 本文中的提示基于我在Hypersistence Optimizer和高性能 Java Persistence 项目中添加对 Spring 6 的支持所做的工作。 爪哇 17 首先&#xff0c;Spring 6 将最低 Java 版本提…

2022.11.27 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.基于后向传播算法的多时间尺度RNN4.1 循环神经网络&#xff08;RNN&#xff09;4.2 基于多时间尺度的RNN预测模型5.实验5.1 数据简介5.2 数据分析5.3 评价指标5.4 实验结果6.结论深度学习1.循环神经网络&#xff08;RNN&#xff09;1.…

Flutter 5 大本地数据库解决方案

Flutter 5 大本地数据库解决方案 原文 https://levelup.gitconnected.com/top-5-local-database-solutions-for-flutter-development-6351cd494070 前言 这里列出了最流行的数据库解决方案以及代码示例。 选择正确的数据管理系统对于提高效率和可 extension 性以及影响可用性和…

3DConvCaps:3DUNet与卷积胶囊编码器用于医学图像分割

摘要 卷积神经网络需要大量的训练数据&#xff0c;无法处理物体的姿态和变形。此外其中的池化层也倾向于丢弃位置等重要的信息。CNN对旋转和仿射变换非常敏感。 胶囊网络是最近出现的一种新型体系结构&#xff0c;其通过动态路由和卷积步长代替池化层&#xff0c;在部分整体表…

steam搬砖项目的核心内容解答

大家好&#xff0c;我是阿阳 如果你有个几千块钱积蓄&#xff0c;想做点小生意&#xff0c;又不知道做啥&#xff0c;那我建议你来做steam搬砖&#xff0c;steam搬砖是什么呢&#xff1f;steam搬砖怎么赚钱的呢&#xff1f;你听我一步步跟你说来 steam搬砖是什么呢&#xff1f…

详解GMM高斯混合模型EM模型

一般讲到GMM就会讲到EM。 我不过多的介绍EM算法。这里只是举一些例子来看看真实的GMM怎么用EM算的。 一、GMM的作用 记住GMM的作用&#xff0c;就是聚类&#xff01; 二、GMM有hard和soft两种 hard-GMM和soft-GMM是为了对标k-means和soft k-means。在中文互联网上搜索到的GM…

【SVM分类】基于matlab哈里斯鹰算法优化支持向量机SVM分类【含Matlab源码 2243期】

⛄一、哈里斯鹰算法简介 HHO算法用数学公式来模拟现实中哈里斯鹰在不同机制下捕捉猎物的策略.在HHO中&#xff0c;哈里斯鹰是候选解&#xff0c;猎物随迭代逼近最优解.HHO算法包括两个阶段&#xff1a;全局探索阶段、局部开采阶段。 1 全局探索阶段 在这一阶段中&#xff0c;哈…

springboot thymeleaf使用

导入依赖 <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.0.11.RELEASE</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <a…

springboot集成swagger并更换主题

前言 swagger对于web一个开发人员&#xff0c;可以说是非常熟悉的了&#xff0c;之前都是用的公司搭好的框架拿来就用&#xff0c;自己也没有研究过&#xff0c;最近想搞一个自己拿来练手的基础框架&#xff0c;因此来记录一下springboot集成swagger的过程和注意事项。 swagg…

云南白药正在度过“中年危机”

​文丨熔财经 作者|kinki 今年&#xff0c;正是云南白药创制的120周年&#xff0c;虽然是一个百年老字号品牌&#xff0c;但在过去的数年间&#xff0c;云南白药在新品研制、跨界发展乃至品牌推广上都做了不少新尝试。今年&#xff0c;云南白药更提出了“141”战略&#xff0…