LeetCode 1825 求出MK平均值【Set 队列】 HERODING的LeetCode之路

news2024/12/25 2:20:07

在这里插入图片描述
在这里插入图片描述

解题思路:
好久没更新力扣困难题的题解了,今天这道困难题有点意思,读罢题目一目了然,解题思路清晰明了,就是解题过程细节满满。这是一个数据流场景的问题,保留最后m个元素,但是要去除k个最大,k个最小,返回平均值。这时候数据结构一目了然,那就用三个集合存储k小,k大和m-2k呗,那数据流最后m个如何保证呢,队列!用队列存储序列,当队列的长度超出m,队首出列,同时在三个集合中寻找并删除相关数。那么解题过程如下:

  1. 定义三个集合,一个队列,以及变量sum存储m-2k队列的求和;
  2. 构造函数初始化m,k;
  3. addElement中,首先元素入队列;
  4. 如果数据没满, 数据流入s2中;
  5. 满了,s2中的元素k小进入s1,k大进入s2;
  6. 如果数据超出m,要想办法把超的数放入s2中;
  7. num比k小集合最大的小,把k小集合中最大的放入s2中;
  8. num比k大集合最小的大,把k大集合中最小的放入s2中;
  9. 开始删减,temp为队列中第一个元素;
  10. 先在s1中寻找,再s3和s2,找到temp即删除;
  11. calculateMKAverage函数中,不足m返回-1,否则返回sum / (m - 2 * k)

其中第6步骤非常巧妙,因为数据流中的元素重复,在删除阶段可能会把后来的相同的数删除,那么我们只要保证后来的相同的数在s2中,最后才删s2,这就保证了先来的相同的元素一定会在s1或者s3中先删除,即使s2中有多个重复也不影响最终结果(但是在s1或s3中会影响)。代码如下:

class MKAverage {
private:
    int m, k;
    // 三个集合,分别存储k小、m-2k、k大
    multiset<int> s1, s2, s3;
    queue<int> q;
    long long sum;
public:
    MKAverage(int m, int k) {
        this -> m = m;
        this -> k = k;
        sum = 0;
    }
    
    void addElement(int num) {
        q.push(num);
        // 如果数据流没满
        if(q.size() <= m) {
            s2.insert(num);
            sum += num;
            // 数据流刚好满了
            if(q.size() == m) {
                // 最小集合没满
                while(s1.size() < k) {
                    s1.insert(*s2.begin());
                    sum -= *s2.begin();
                    s2.erase(s2.begin());
                }
                // 最大集合没满
                while(s3.size() < k) {
                    s3.insert(*s2.rbegin());
                    sum -= *s2.rbegin();
                    s2.erase(prev(s2.end()));
                }
            }
            return;
        }
        // 数据流超出
        // 比k小集合最大的小
        if(num < *s1.rbegin()) {
            s1.insert(num);
            s2.insert(*s1.rbegin());
            sum += *s1.rbegin();
            s1.erase(prev(s1.end()));
        } else if(num > *s3.begin()) {
            // 比k大集合最小的大
            s3.insert(num);
            s2.insert(*s3.begin());
            sum += *s3.begin();
            s3.erase(s3.begin()); 
        } else {
            s2.insert(num);
            sum += num;
        }

        // 由于数据流超出1,删减
        int temp = q.front();
        q.pop();
        // 如果在k小集合
        if(s1.count(temp)) {
            s1.erase(s1.find(temp));
            s1.insert(*s2.begin());
            sum -= *s2.begin();
            s2.erase(s2.begin());
        } else if(s3.count(temp)) {
            // 如果在k大集合
            s3.erase(s3.find(temp));
            s3.insert(*s2.rbegin());
            sum -= *s2.rbegin();
            s2.erase(prev(s2.end())); 
        } else {
            // 在m-2k集合中
            s2.erase(s2.find(temp));
            sum -= temp;
        }

    }
    
    int calculateMKAverage() {
        if(q.size() < m) {
            return -1;
        } 
        return sum / (m - 2 * k);
    }
};

/**
 * Your MKAverage object will be instantiated and called as such:
 * MKAverage* obj = new MKAverage(m, k);
 * obj->addElement(num);
 * int param_2 = obj->calculateMKAverage();
 */

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

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

相关文章

设计模式—工厂方法模式

工厂方法模式 文章目录工厂方法模式工厂方法模式是什么理解工厂方法模式代码实例运行截图工厂方法的优点工厂方法的不足工厂方法模式是什么 工厂方法模式属于创建型模式&#xff0c;也叫抽象构造模式&#xff0c; 工厂方法模式将工厂抽象化&#xff0c;并定义一个创建对象的接…

高级语言(C语言)、汇编语言、机器语言区别?编译器如何将高级语言编译成机器语言?

⾼级语⾔&#xff1a; 是相对于汇编语⾔⽽⾔的&#xff0c;是⾼度封装了的编程语⾔&#xff0c;与低级语⾔相对。它是以⼈类的⽇常语⾔为基础的⼀种编程语⾔&#xff0c;使⽤⼀般⼈易于接受的⽂字来表⽰&#xff08;例如汉字、不规则英⽂或其他外语&#xff09;&#xff0c;从…

(二十四)List系列集合

目录 前言: 一、List集合的特有方法 二、List集合的遍历方式有几种&#xff1f; 三、Arraylist集合底层原理 四、LinkedList的特点 前言: List集合包括JavaList接口以及List接口的所有实现类。List集合中的元素允许重复&#xff0c;各元素的顺序放是对象插入的顺序&#xff…

C生万物 | C语言文件操作指南汇总【内附文件外排序源码】

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;万物之源——C 文章目录一、为什么使用文件&#xff1f;二、什么是文件&#xff1f;1、程序文件2、数据文件3、文件名三、文件的打开和关闭1、文件…

自动化测试【软件测试】

自动化测试 什么是自动化 有效减少人力的消耗&#xff0c;同时提高生活的质量 通过自动化测试有效减少人力的投入&#xff0c;同时提高了测试的质量和效率 由于回归测试&#xff0c;版本越来越多&#xff0c;版本回归的压力越来越大&#xff0c;仅仅通过人工测试来回归所有版本…

2.3、进程控制

整体框架 1、什么是进程控制&#xff1f; 进程控制的主要功能是对系统中的所有进程实施有效的管理&#xff0c; 它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简单来说&#xff1a;进程控制就是要实现进程状态转换 2、如何实现进程控制&#xff1f; 2.1、进程…

ATAC-seq分析:TSS 信号(7)

ATACseq ATACseq - 使用转座酶并提供一种同时从单个样本的转录因子结合位点和核小体位置提取信号的方法。 1. 数据类型 上面这意味着我们的数据中可能包含多种信号类型。 我们将从无核小体区域和转录因子&#xff08;我们的较短片段&#xff09;周围获得信号。我们的一部分信号…

2-Spring核心与设计思想

目录 1.Spring是什么&#xff1f; 2.容器是什么&#xff1f; 3.IoC是什么&#xff1f; 3.1.传统程序开发 3.2.控制反转式程序开发 3.3.对比总结规律 4.理解Spring IoC 4.1.将对象(Bean)存入到容器(Spring)&#xff1b; 4.2.从容器中取出对象。 5.DI概念说明 1.Spring…

计算机编程背景

&#x1f496; 欢迎来阅读子豪的博客&#xff08;JavaEE篇 &#x1f934;&#xff09; &#x1f449; 有宝贵的意见或建议可以在留言区留言 &#x1f4bb; 欢迎 素质三连 点赞 关注 收藏 &#x1f9d1;‍&#x1f680;码云仓库&#xff1a;补集王子的代码仓库 不要偷走我小火…

classpath类路径是什么

Spring Boot 一、简介 classpath类路径在 Spring Boot 中既指程序在打包前的/java/目录加上/resource目录&#xff0c;也指程序在打包后生成的/classes/目录。两者实际上指的是同一个目录&#xff0c;里面包含的文件内容一模一样。 二、获取classpath路径 以下两种方式均可…

Icarus Verilog

Icarus Verilog 是一个Verilog仿真工具&#xff0c;以编译器的形式工作&#xff0c;将以verilog编写的源代码编译为某种目标格式。如果要进行仿真的话&#xff0c;可以生成一个vvp的中间格式&#xff0c;由其所附带的vvp命令执行。 https://github.com/steveicarus/iverilog …

面试官:请设计一个能支撑百万连接的系统架构!

目录 1、到底什么是连接&#xff1f;2、为什么每次发送请求都要建立连接&#xff1f;3、长连接模式下需要耗费大量资源4、Kafka遇到的问题&#xff1a;应对大量客户端连接5、Kafka的架构实践&#xff1a;Reactor多路复用6、优化后的架构是如何支撑大量连接的 这篇文章&#x…

SQL Server 全文索引的应用

在公司项目中提出了一个需求&#xff1a; 搜索包含指定关键词的数据。得到这需求后&#xff0c;站在技术角度考虑第一时间就联想到使用SQL里面“like”查询语句。进一步分析需求后&#xff0c;发现“Like”查询满足不到实际的要求。 示例&#xff1a; ---------------------…

【Ajax】接口与接口测试工具PostMan

一、接口接口的概念使用 Ajax 请求数据时&#xff0c;被请求的 URL 地址&#xff0c;就叫做数据接口&#xff08;简称接口&#xff09;。同时&#xff0c;每个接口必须有请求方式。例如&#xff1a;http://www.liulongbin.top:3006/api/getbooks 获取图书列表的接口(GET请求)ht…

【4 - 降维算法PCA和SVD - 案例部分】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

为何香港的IB状元特别多?

今年IB预科课程&#xff08;The International Baccalaureate Diploma Programme&#xff0c;IBDP&#xff09;公开考试放榜&#xff0c;香港的学校又是大丰收的一年&#xff01;因为香港今年一共有九十三名IB状元&#xff0c;即IB的总分为四十五分满分&#xff0c;而他们全部取…

Linux 环境部署 Nexus 服务

一 私服是什么&#xff1f; 一个特殊的远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;供局域网内的开发人员使用。 当Maven需要下载构建的使用&#xff0c; 它先从私服请求&#xff0c;如果私服上没有的话&#xff0c;则从外部的远程仓库下载&#xff0c;然后…

算力服务亟待破局,超聚变向新而行

“超聚变已独立活下来。”超聚变产品线总裁范瑞琦在2023新品发布会上透露。自从一年多前从华为体系独立&#xff0c;超聚变公司的未来就颇受业界关注。一方面&#xff0c;算力产业蒸蒸日上&#xff0c;各方尤为关注超聚变的产业定位以及发展算力产业的着力点&#xff1b;另一方…

mysql存储过程的流程控制

本文来说下mysql存储过程的流程控制语句 文章目录流程控制概述IF语句CASE语句LOOP语句LEAVE语句ITERATE语句REPEAT语句WHILE语句本文小结流程控制概述 存储过程中可以使用流程控制来控制语句的执行。 MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPE…

Cesium设置模型朝向速度矢量方向

Cesium设置模型朝向速度矢量方向 文章目录Cesium设置模型朝向速度矢量方向1. 需求场景2. 技术路线2.1 VelocityOrientationProperty2.2 VelocityVectorProperty3. 参考链接1. 需求场景 现有一段飞机起飞、爬升的轨迹数据&#xff0c;需要在Cesium中模拟出飞行过程动画&#xf…