leetcode LCP 24. 数字游戏【等价转换+对顶堆维护中位数】

原题链接:LCP 24. 数字游戏

题目描述:

小扣在秋日市集入口处发现了一个数字游戏。主办方共有 N 个计数器,计数器编号为 0 ~ N-1。每个计数器上分别显示了一个数字,小扣按计数器编号升序将所显示的数字记于数组 nums。每个计数器上有两个按钮,分别可以实现将显示数字加一或减一。小扣每一次操作可以选择一个计数器,按下加一或减一按钮。

主办方请小扣回答出一个长度为 N 的数组,第 i 个元素(0 <= i < N)表示将 0~i 号计数器 初始 所示数字操作成满足所有条件 nums[a]+1 == nums[a+1],(0 <= a < i) 的最小操作数。回答正确方可进入秋日市集。

由于答案可能很大,请将每个最小操作数对 1,000,000,007 取余。

输入输出描述:

示例 1:

输入:nums = [3,4,5,1,6,7]

输出:[0,0,0,5,6,7]

解释: i = 0,[3] 无需操作 i = 1,[3,4] 无需操作; i = 2,[3,4,5] 无需操作; i = 3,将 [3,4,5,1] 操作成 [3,4,5,6], 最少 5 次操作; i = 4,将 [3,4,5,1,6] 操作成 [3,4,5,6,7], 最少 6 次操作; i = 5,将 [3,4,5,1,6,7] 操作成 [3,4,5,6,7,8],最少 7 次操作; 返回 [0,0,0,5,6,7]。

示例 2:

输入:nums = [1,2,3,4,5]

输出:[0,0,0,0,0]

解释:对于任意计数器编号 i 都无需操作。

示例 3:

输入:nums = [1,1,1,2,3,4]

输出:[0,1,2,3,3,3]

解释: i = 0,无需操作; i = 1,将 [1,1] 操作成 [1,2] 或 [0,1] 最少 1 次操作; i = 2,将 [1,1,1] 操作成 [1,2,3] 或 [0,1,2],最少 2 次操作; i = 3,将 [1,1,1,2] 操作成 [1,2,3,4] 或 [0,1,2,3],最少 3 次操作; i = 4,将 [1,1,1,2,3] 操作成 [-1,0,1,2,3],最少 3 次操作; i = 5,将 [1,1,1,2,3,4] 操作成 [-1,0,1,2,3,4],最少 3 次操作; 返回 [0,1,2,3,3,3]。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^3

解题思路:

首先我们要将前i个数变为公差为1的等差数列,相当于前i个数nums[i],每个nums[i]减去i,然后将前i个数变为相等的最少操作次数,将nums[i]减去i就是第0个位置减去0,第一个位置减去1,第二个位置减去2,依次类推,也就是说对于所有相邻的俩个位置i,i+1,第i+1个位置都比第i个位置多减去1,对于每个nums[i]减去i之后只需要再让每个数变为相等即可,此时就相当于将原来的前i个数变为公差为1的等差数列,所以我们先对每个nums[i]减去i之后,求对于所有的前i个数变为一样的最少操作次数即可,那么我们可以知道这是一个经典的问题,肯定是将前i个数都变为前i个数的中位数时操作次数最少,我们可以使用俩个堆来维护这前i个数的中位数,一个小根堆,一个大根堆,具体维护过程如下。

首先我们知道当i为偶数时,大根堆维护较小的i/2个数,小根堆维护较大的i/2个数,此时把所有数变为中位数的最少操作次数为小根堆中所有数的和减去大根堆中所有数的和。

当i为奇数时,大根堆维护较小的i/2个数,小根堆维护较大的i/2+1个数,设小根堆堆顶元素为x,此时小根堆的堆顶就是中位数,那么此时把所有数变为中位数的最少操作次数为小根堆中所有数的和减去x减去大根堆中所有元素的和。

当前面已经处理的元素个数为偶数时,我们先将当前数放入大根堆,然后将大根堆的堆顶元素弹出加入小根堆。

当前面已经处理的元素个数为奇数时,那么前面的小根堆里面元素个数比大根堆里面元素个数多1,此时将当前元素加入小根堆,然后将小根堆堆顶元素弹出加入大根堆。

时间复杂度:使用俩个堆维护中位数,时间复杂度为O(nlogn).

空间复杂度:使用俩个堆维护前i个数的中位数,空间复杂度为O(n).

cpp代码如下:

const int mod=1e9+7;
class Solution {
public:vector<int> numsGame(vector<int>& nums) {int n=nums.size();vector<int>ans(n);priority_queue<int>left;  //大根堆priority_queue<int,vector<int>,greater<int>>right; //小根堆int leftsum=0,rightsum=0; //leftsum维护大根堆中元素的和,rightsum维护小根堆中元素的和for(int i=0;i<n;i++){int x=nums[i]-i;  //先将每个元素nums[i]减去iif(i%2==0){left.push(x);  //前面元素个数为偶数,先将当前元素插入大根堆,然后将大根堆最大元素加入小根堆leftsum=(leftsum+x)%mod;int v=left.top();left.pop();leftsum=(leftsum-v+mod)%mod;right.push(v);rightsum=(rightsum+v)%mod;v=right.top();ans[i]=(rightsum-v-leftsum+mod)%mod; //v是中位数}else {right.push(x);  //前面元素个数是奇数,先将当前元素加入小根堆,然后将小根堆中最小元素加入大根堆rightsum=(rightsum+x)%mod;int v=right.top();right.pop();rightsum=(rightsum-v+mod)%mod;left.push(v);leftsum=(leftsum+v)%mod;ans[i]=(rightsum-leftsum+mod)%mod;}}return ans;}
};

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

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

相关文章

JavaScript事件冒泡和捕获

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 事件传播是JavaScript中非常重要的一个概念,它描述了从嵌套元素到祖先…

【C++干货铺】哈希结构在C++中的应用

目录 unordered系列关联式容器 unordered_map unordered_map的接口说明 1.unordered_map的构造 2. unordered_map的容量 3. unordered_map的迭代器 4. unordered_map的元素访问 5. unordered_map的查询 6. unordered_map的修改操作 7. unordered_map的桶操作 底层结构 …

mysql+node.js+html+js完整扫雷项目

一.下载 可以直接下载绑定资源&#xff0c; 也可以访问&#xff1a;克隆仓库&#xff1a;mine_clearance: mysqlnode.jshtmljs完整扫雷项目 (gitee.com) 二.运行sql数据文件 将mysql数据文件导入到本地 先在本地localhost里创建数据库 mine_clearance&#xff0c; 然后如图&…

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索 效果图定义子组件父组件应用 效果图 定义子组件 主要结合el-select和el-tree两个组件改造的。 <template><div class"selectTree"><el-select filterable :filter-method"filterMe…

微软给Windows 11增添了一个由AI支持的‘Voice Clarity’功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

linux搭建jupyter

查看虚拟环境 conda info --envs进入虚拟环境 conda activate my_env pip install jupyter pip install ipykernel1. jupyter notebook启动 1.1 创建临时jupyter notebook任务 jupyter notebook --ip0.0.0.0 --no-browser --allow-root --notebook-dir/home/xxx1.2 jupyter…

共用体与枚举法,链表的学习

结构体注意事项&#xff1a; 1.结构体类型可以定义在main函数里面&#xff0c;但是此时的作用域就被限定在该函数中 2.结构体的的的定义的形式&#xff1a;a.先定义类型&#xff0c;后定义变量-----struct stu s b.定义类型的同时&#xff0c;定义了变量&#xff1a;struct…

Notion 开源替代品:兼容 Miro 绘图 | 开源日报 No.162

toeverything/AFFiNE Stars: 25.6k License: NOASSERTION AFFiNE 是下一代知识库&#xff0c;将规划、排序和创建集于一身。它是一个注重隐私、开源、可定制且即插即用的替代方案&#xff0c;可以与 Notion 和 Miro 相媲美。主要功能和优势包括&#xff1a; 超融合&#xff1…

轻松使用python将PDF转换为图片(成功)

使用PyMuPDF&#xff08;fitz&#xff09;将PDF转换为图片 在处理PDF文件时&#xff0c;我们经常需要将PDF页面转换为图片格式&#xff0c;以便于在网页、文档或应用程序中显示。Python提供了多种方式来实现这一需求&#xff0c;本文将介绍如何使用PyMuPDF&#xff08;也称为f…

本地部署GeoServe服务并结合内网穿透实现任意浏览器远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

Python代码重构库之rope使用详解

概要 Python是一门强大的编程语言,但在大型项目中,维护和重构代码可能会变得复杂和困难。为了提高开发人员的效率和准确性,有许多工具可用于辅助代码重构和智能代码补全。其中之一是Python Rope。 Python Rope是一个用于Python编程语言的强大工具,它提供了丰富的功能,包…

绕过过滤注释符的sql注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、MySQL 注释符 注释符的作用 代码说明:注释用于对代码段进行说明,帮助开发和维护人员理解代码的功能和目的。注释内容在执行时会被数据库引擎忽略,不会影响实际的SQL执行。…

git pull的时候报错

错误信息&#xff1a;You have not concluded your merge (MERGE_HEAD exists). Please, commit your changes before you can merge. 原因&#xff1a;上一次pull的代码有冲突自动合并失败&#xff0c;在下一次pull之前你没有很好的解决这个冲突 方法&#xff1a; 1&#x…

【RT-DETR有效改进】利用YOLO-MS的MSBlock模块改进ResNet中的Bottleneck(RT-DETR深度改进)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块(其其实不能算是Conv但是其应该是一整个模块),我们将其用于替换我们ResNet中Basic组合出一种新的结构,来替换我们网络中的…

Spring Boot 整合 Redis 使用教程

作为开发者&#xff0c;相信大家都知道 Redis 的重要性。Redis 是使用 C 语言开发的一个高性能键值对数据库&#xff0c;是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。 Redis 以超…

在ROS(Robot Operating System)中常用的ROS功能包

ROS&#xff08;Robot Operating System&#xff09;拥有大量的功能包&#xff0c;这些功能包提供了从底层硬件控制到高级算法处理的多种功能。以下是一些常用的ROS功能包&#xff1a; 1. roscpp 和 rospy&#xff1a; - roscpp 是ROS的C客户端库&#xff0c;它提供了用于编…

网络通信--术语对照表

术语对照表 OSI 开放式系统互联通信参考模型&#xff08;英语&#xff1a;Open System Interconnection Reference Model&#xff0c;缩写为 OSI&#xff09;&#xff0c;简称为OSI模型&#xff08;OSI model&#xff09;&#xff0c;一种概念模型&#xff0c;由国际标准化组…

PyTorch复现网络模型VGG

VGG 原论文地址&#xff1a;https://arxiv.org/abs/1409.1556VGG是Visual Geometry Group&#xff08;视觉几何组&#xff09;的缩写&#xff0c;它是一个在计算机视觉领域中非常有影响力的研究团队&#xff0c;主要隶属于牛津大学的工程系和科学系。VGG以其对卷积神经网络&am…

Ubuntu(22.04):解决升级后在VirtualBox中的启动非常慢的问题

Ubuntu22.04是通过VirtualBox的虚机安装的&#xff0c;最近升级了Ubuntu22.04后&#xff0c;每次启动都非常的慢 $ systemd-analyze blame 5min 2.287s plymouth-quit-wait.service 5min 18ms vboxadd.service 可以看到是这两个服务启动的非常耗时&#xff0c;各用了5分钟多。 …

Vue3_基础使用

vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对一个数据的处理在不同的配置中&#xff0c;当业务复杂时很难维护&#xff0c;修改起来也不好查找。 vue3的组合式&#xff1a;将针对数据的方法计算属性等等放在一…