leetcode--优先队列

news2024/11/25 6:57:09

2163,删除元素后的最小差值
给你一个下标从 0 开始的整数数组 nums ,它包含 3 * n 个元素。

你可以从 nums 中删除 恰好 n 个元素,剩下的 2 * n 个元素将会被分成两个 相同大小 的部分。

前面 n 个元素属于第一部分,它们的和记为 sumfirst 。
后面 n 个元素属于第二部分,它们的和记为 sumsecond 。
两部分和的 差值 记为 sumfirst - sumsecond 。

比方说,sumfirst = 3 且 sumsecond = 2 ,它们的差值为 1 。
再比方,sumfirst = 2 且 sumsecond = 3 ,它们的差值为 -1 。
请你返回删除 n 个元素之后,剩下两部分和的 差值的最小值 是多少。

示例 1:

输入:nums = [3,1,2]
输出:-1
解释:nums 有 3 个元素,所以 n = 1 。
所以我们需要从 nums 中删除 1 个元素,并将剩下的元素分成两部分。

  • 如果我们删除 nums[0] = 3 ,数组变为 [1,2] 。两部分和的差值为 1 - 2 = -1 。
  • 如果我们删除 nums[1] = 1 ,数组变为 [3,2] 。两部分和的差值为 3 - 2 = 1 。
  • 如果我们删除 nums[2] = 2 ,数组变为 [3,1] 。两部分和的差值为 3 - 1 = 2 。
    两部分和的最小差值为 min(-1,1,2) = -1 。
    示例 2:

输入:nums = [7,9,5,8,1,3]
输出:1
解释:n = 2 。所以我们需要删除 2 个元素,并将剩下元素分为 2 部分。
如果我们删除元素 nums[2] = 5 和 nums[3] = 8 ,剩下元素为 [7,9,1,3] 。和的差值为 (7+9) - (1+3) = 12 。
为了得到最小差值,我们应该删除 nums[1] = 9 和 nums[4] = 1 ,剩下的元素为 [7,5,8,3] 。和的差值为 (7+5) - (8+3) = 1 。
观察可知,最优答案为 1 。

首先我们看到“前面 n 个元素属于第一部分,后面 n 个元素属于第二部分”,故我们可以分别存储两个部分,且又要使得两部分的差值最小,那么前一部分就应该尽可能小,后一部分应该尽可能大
如何实现黄色标注处的目标呢,这是就要用到优先队列,前一部分,使用大顶堆(减去大顶堆的头元素)依次删去最大值,自然也就留下了最小值。
后一部分,采用小顶堆(减去小顶堆的头元素)依次删去最小值,自然留下了最大值。
对数组的存储也是有讲解的,首先我们需返回和之差,故采用前缀和,不过求和方向不同,前一部分有前往后,第二部分,又后往前(便于处理),之后的n/3-1到2*k的位置就是各个部分的满足要求前缀和。
那我们该如何划分这两个部分呢?官方的题解讲的挺好的。
在这里插入图片描述
即中间部分是我们寻找目标值得地方(k-1到2k位置处)。
详情见代码:

class Solution {
public:
    long long minimumDifference(vector<int>& nums) {
        int n=nums.size(),k=n/3;
        vector<long long>s1(n,0),s2(n,0);
        priority_queue<int>small;
        for(int i=0;i<2*k;i++)
        {
            s1[i]=(i>0)?s1[i-1]:0;
            small.push(nums[i]);
            s1[i]+=nums[i];
            if(small.size()>k)
            {
                s1[i]-=small.top();
                small.pop();
            }
        }
        priority_queue<int,vector<int>,greater<int>>big;
        for(int i=n-2;i>=k-1;i--)
        {
            s2[i]=s2[i+1];
            big.push(nums[i+1]);
            s2[i]+=nums[i+1];
            if(big.size()>k)
            {
                s2[i]-=big.top();
                big.pop();
            }
        }
        long long res=1e15;
        for(int i=k-1;i<2*k;i++)
        {
            res=min(res,s1[i]-s2[i]);
        }
        return res;
    }
};

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

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

相关文章

RabbitMQ如何保证顺序性

1. RabbitMQ消息顺序性说明 顺序性&#xff1a; 消息的顺序性是指消费者消费到消息和发送者发布的消息的顺序是一致的 举个例子&#xff0c;不考虑消息重复的情况下&#xff0c;如果生产者发布的消息分别为msg1、msg2、msg3 那么消费者必然也是按照 msg1、msg2、msg3 的顺序来…

【数据结构】--- 博主拍了拍你并向你扔了一“堆”二叉树(堆的概念+结构+代码实现)

文章目录 前言&#x1f31f;一、二叉树的顺序结构及实现&#xff1a;&#x1f31f;二、堆的概念及结构&#xff1a;&#x1f31f;三、堆的代码实现&#xff1a;&#x1f30f;3.1 堆的创建&#xff1a;&#x1f30f;3.2 堆的结构&#xff1a;&#x1f30f;3.3 初始化&#xff1a…

Spring Security 如何实现身份认证和授权?

Spring Security 是一个开源的安全框架&#xff0c;提供了基于权限的访问控制、身份认证、安全性事件发布等功能。在 Spring Boot 应用中使用 Spring Security 可以非常方便地实现用户身份认证和授权。 Spring Security 实现身份认证的主要方式是使用认证过滤器链&#xff0c;…

C语言入门级小游戏——扫雷

文章目录 游戏思路游戏文件的创建游戏菜单棋盘的创建初始化棋盘打印棋盘 布置雷排查雷game.h —— 游戏函数的声明game.c —— 游戏函数的实现test.c —— 游戏的测试 今天我们写一个小游戏——扫雷来增加我们对编程的兴趣 希望这篇文章对友友们有帮助! 游戏思路 游戏文件的创…

Linux:iptables防火墙(SNAT和DNAT)

Linux&#xff1a;iptables防火墙 一、SNAT策略及应用1.1 SNAT原理1.2 SNAT应用 二、DNAT策略及应用2.1 DNAT原理2.2 DNAT应用 一、SNAT策略及应用 1.1 SNAT原理 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xff08;私有不能在Internet中正常路由…

MySQL数据库笔记——进阶篇

文章目录 存储引擎MySQL体系结构存储引擎简介InnoDB介绍MyISAMMemory 存储引擎的选择小结 索引概述索引结构概述BtreeBTreeHash 存储引擎 MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案…

《计算机网络—自顶向下方法》 Wireshark实验(十):NAT 协议分析

NAT&#xff08;Network Address Translation&#xff09;网络地址转换&#xff0c;即在私有地址和全局地址之间转换的协议。私有地址是不能用在 Internet 上(路由器将丢弃寻址这种地址的包)的内部地址。这些地址是不能够在公网上面用的&#xff0c;只能用在局域网的内部。私有…

win安装Nodejs

文章目录 1、安装环境2、安装步骤3、更换npm源为淘宝镜像4、更多node版本下载 1、安装环境 node.js下载官网: nodejs官网 点击选中图标下载即可&#xff1a; 2、安装步骤 1、双击安装包&#xff0c;一直点击next 2、点击change按钮&#xff0c;更换到自己的指定安装位置&…

基于fpga的图像处理之3x3_5x5算子模板中值排序

本文的思路框架&#xff1a; ①本文介绍3x3算子模块和5x5算子模块中&#xff0c;矩阵转化成串行数据后&#xff0c;对其排序&#xff0c;并获取矩阵中值数据&#xff1b; ②本例程中采用的FPGA设计技巧&#xff0c;可用于借鉴&#xff0c;一是采用for循环实现串行数据转化并行数…

vite创建vue2项目

使用vite首先需要注意官方给出的兼容性注意 Vite 需要 Node.js 版本 14.18&#xff0c;16。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。 1.初始化vite项目 输入以下命令&#…

Spring MVC 是什么?与 Struts 的区别是什么?

Spring MVC是Spring框架中的一个模块&#xff0c;它提供了一种基于MVC&#xff08;Model-View-Controller&#xff09;架构的Web开发方式。与传统的JSP/Servlet开发方式相比&#xff0c;Spring MVC更加灵活、高效&#xff0c;可以帮助开发人员快速构建高质量的Web应用程序。本文…

vue diff算法与虚拟dom知识整理(10) 梳理patch处理相同节点比较的基本逻辑

这次 我们来讲 diff算法处理到 当新旧节点 是同一个节点时的处理 我们之前也说过 如果不是同一个节点 他就会暴力拆旧 把新的插上去 但当他们是同一个节点 需要精细化比较 最做小化更新 这块我们还没有处理 打开我们的案例 打开 patch.js 对应其实就还是这一块还没有写 我们…

PostgreSQL查询引擎——transform expressions之AEXPR_OP

static Node *transformAExprOp(ParseState *pstate, A_Expr *a){Node *lexpr a->lexpr; Node *rexpr a->rexpr; // 操作符左右表达式Node *result;/* Special-case "foo NULL" and "NULL foo" for compatibility with standards-broke…

Bug——后端返回LocalDateTime类型数据中间出现一个T

错误如下图所示: 返回的JSON格式数据里面会有一个多出来的T. 解决方案&#xff1a; 在后端的POJO层的实体类的LocalDateTime属性上面加上一个注解 JsonFormat(pattern"yyyy-MM-dd HH:mm:ss") 如下所示&#xff0c;然后在返回JSON格式数据时就不会出现那个多余的T了…

C++之模板初阶

目录 前言 1.泛型编程 2.模板 2.1 函数模板 2.1.1 函数模板概念 2.1.2 函数模板格式 2.1.3 函数模板的原理 2.1.4 函数模板的实例化 2.1.5 模板参数的匹配原则 2.2 类模板 2.2.1 类模板定义模式 2.2.2 类模板的实例化 前言 我们会不会有疑惑为什么C语言中&#xf…

Python学习笔记——cmeans模糊聚类例程

文章目录 模糊聚类应用简介安装环境demo&#xff1a;运行结果 模糊聚类应用简介 模糊聚类即通过模糊数学&#xff08;处理模糊或不确定性信息的数学方法&#xff09;的相关算法进行聚类分析任务。 常用的模糊聚类算法包括模糊C均值聚类&#xff08;FCM&#xff0c;Fuzzy-c mea…

TryHackMe-Red Team Capstone Challenge (红队挑战)【真实红队模拟】

Red Team Capstone Challenge 注意&#xff1a;我不会在这里提及相关的flag&#xff0c;只专心打&#xff1b;flag可以自己用各个hostname尝试一遍 挑战作者的一句话 这个房间被评为坚硬&#xff0c;但因为它是你前面的一座山&#xff0c;它可能被评为疯狂。但是&#xff0c;…

【Vue3】滑动验证组件 | 滑动验证

前言 滑块验证不只判断是否滑动到尾部&#xff0c;真正的目的是检测用户行为&#xff0c;检测行为是人为、脚本、还是其它。 防止使用脚本大量注册、请求等 。比如发送请求时&#xff0c;判断用户在某个页面停留了多长时间。登录、注册时是否点击了登录、注册按钮&#xff0c;…

Lesson1——数据结构前言

前言&#xff1a; 今天我们正式开始一个新的专栏——初阶数据结构&#xff08;C语言实现&#xff09;&#xff0c;本专栏后续持续更新时间复杂度空间复杂度、顺序表、链表、栈和队列、二叉树、排序等算法的相关知识&#xff0c;欢迎大家互相学习&#xff0c;可以私信互相讨论哦…

一次oracle环境 enq: TX - allocate ITL entry锁问题分析

enq: TX - allocate ITL entry锁问题分析 通过分析问题时间段两个节点的AWR报告&#xff0c;TOP1等待为锁竞争enq: TX - allocate ITL entry&#xff0c;该等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作的数据行处于相同的…