LeetCode:LCP 24. 数字游戏(对顶堆求中位数 Java)

目录

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]。

实现代码与解析:

对顶堆求中位数

class Solution {public int[] numsGame(int[] nums) {final int MOD = 1000000007;PriorityQueue<Integer> lq = new PriorityQueue<>((a, b) -> b - a); // 大根堆PriorityQueue<Integer> rq = new PriorityQueue<>(); // 小根堆int n = nums.length;int[] res = new int[n];long lsum = 0;long rsum = 0;for (int i = 0; i < n; i++) {int t = nums[i] - i;if (i % 2 == 0) {lq.offer(t);lsum += t;int j = lq.peek();lq.poll();lsum -= j;rq.offer(j);rsum += j;res[i] = (int) ((rsum - rq.peek() - lsum) % MOD);} else {rq.offer(t);rsum += t;int j = rq.peek();rq.poll();rsum -= j;lq.offer(j);lsum += j;res[i] =  res[i] = (int) ((rsum - lsum) % MOD);}}  return res;}
}

原理思路:

        题目转化:就是所有nums[i] - i 变成相同值的最小和,而这个相同值就是他们的中位数,把这些数放在数轴上就可以很好的观察出来,也可以作为定理记下来。  

        至于为啥是num[i] - i,可以简单证明一下。例如有一个值 a0, a1, a2,假设最后结果为b , b + 1, b + 2,那么和就为|a0 - (b + 0)| + |a1 - (b + 1)| + |a2 - (b + 2)| 等价于sum|(ai - i - b)|,把ai - i 看成一个整体ti,那么就变成了每一个 ti 到某一个值的距离最小和。这个值就是中位数。  

        所以这题的核心就是求中位数,如何求?

就是对顶堆(双优先级队列lq,rq)

- 中位数左的小数用lq大顶堆维护  

- 中位数右的大数用rq小顶堆维护  

- x 为我们正在遍历的数  

- 如果前缀长度是奇数,此时 lq 和 rq 大小相等,我们先把 x 插入 lq,然后弹出 lq 的堆顶,加到 rq 中。这一操作可以保证,无论 x 是大是小,此时 rq 的堆顶就是中位数。  

- 如果前缀长度是偶数,此时 lq 比 rq 少一个元素,我们先把 x 插入 rq,然后弹出 rq 的堆顶,加到 lq 中。

        当然这里是可以优化的,比如奇数时,lq里的最大值都小于x,那么就直接放进rq就好了,就省去了进lq,再出来进rq的步骤,偶数时同理。

        这题只要想到题目转换的含义就很好写了。

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

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

相关文章

《计算机网络简易速速上手小册》第9章:物联网(IoT)与网络技术(2024 最新版)

文章目录 9.1 IoT 架构与通信协议 - 打造智能世界的秘诀9.1.1 基础知识9.1.2 重点案例&#xff1a;使用 Python 和 MQTT 实现智能家居照明系统准备工作Python 脚本示例发布者&#xff08;灯光控制&#xff09;订阅者&#xff08;灯光状态接收&#xff09;&#xff1a; 9.1.3 拓…

快速Diff算法-Vue3

快速Diff算法 快速 Diff 算法在实测中性能最优。它借鉴了文本 Diff 算法中的预处理思路&#xff0c;先处理新旧两组子节点中相同的前置节点和相同的后置节点。当前置节点和后置节点全部处理完毕后&#xff0c;如果无法简单地通过挂载新节点或者卸载已经不存在的节点来完成更新…

AD24-Class、飞线、PCB Nets的管理及添加、层的管理

一、Class 1、Class介绍 2、Class添加与显示 ①添加 ②显示通过Panels-PCB&#xff0c;即可将创建的类显示再左上方窗口 3、Class的编辑管理 ①概述 ②颜色更改 二、飞线 1、概述 2、 飞线的打开、关闭 打开&#xff1a;Alt左上角滑动 N&#xff1a;可以针对性的显示和隐…

Linux:使用grep和more索日志内容排查Bug

grep # 搜索文件内容显示行号 grep -n "要搜索的关键词" 文件名more 快捷键&#xff1a; 空白键&#xff08;space&#xff09;下一页b键 &#xff08;back&#xff09;上一页 示例 # 从第 20 行开始显示文档内容 more 20 文件名参考 linux查看命令 more 、les…

深度学习环境配置:Anaconda 安装和 pip 源

conda是一种通用包管理系统&#xff0c;与pip的使用类似&#xff0c;环境管理则允许用户方便地安装不同版本的python并可以快速切换。 Anaconda则是一个打包的集合&#xff0c;里面预装好了conda、某个版本的python、众多packages、科学计算工具等等&#xff0c;就是把很多常用…

Vue3 - 从 vue2 到 vue3 过渡,这一套就够了(案例 + 效果演示)(二)

目录 一、组合式 API 的使用 1.1、watch 函数 1.2、watchEffect 函数 1.3、toRef 和 toRefs 1.3.1、toRef 1.3.2、toRefs 1.4、vue3 的声明周期 一、组合式 API 的使用 1.1、watch 函数 与 vue2.x 中的 watch 配置功能一致&#xff0c;但是多了一些坑&#xff1a; 这…

Attempt to invoke virtual method ‘-‘ on a null object reference错误总结

Android studio开发 出现这个问题一般是&#xff1a;一个Activity中调用另一个xml布局文件&#xff0c;即非本Activity所绑定的xml布局文件中的控件&#xff0c;这时候就不能直接findViewById&#xff0c;不然会报错指向空对象 LayoutInflater factory LayoutInflater.from(…

【蓝桥杯】环形链表的约瑟夫问题

目录 题目描述&#xff1a; 输入描述&#xff1a; 输出描述&#xff1a; 示例1 解法一&#xff08;C&#xff09;&#xff1a; 解法二&#xff08;Cpp&#xff09;&#xff1a; 正文开始&#xff1a; 题目描述&#xff1a; 据说著名犹太历史学家 Josephus 有过以下故事&a…

Pytest测试用例参数化

pytest.mark.parametrize(参数名1,参数名2...参数n, [(参数名1_data1,参数名2_data1...参数名n_data1),(参数名1_data2,参数名2_data2...参数名n_data2)]) 场景&#xff1a; 定义一个登录函数test_login,传入参数为name,password&#xff0c;需要用多个账号去测试登录功能 # …

[职场] 留学生课程辅导待遇 #媒体#经验分享#其他

留学生课程辅导待遇 留学生课程辅导师需要具备专业知识和良好的沟通技巧&#xff0c;能够全面帮助留学生解决学习和生活方面的问题&#xff0c;提高留学生的学习效果和适应能力。 工作内容&#xff1a; 1.提供学习计划和课程指导&#xff1a;留学生课程辅导师可以帮助留学生…

JAVA方法引用:

方法引用的出现原因在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数做操作那么考虑一种情况&#xff1a;如果我们在Lambda中所指定的操作方案&#xff0c;已经有地方存在相同方案&#xff0c;那是否还有必要再写重复逻辑呢&a…

Go中的并发性介绍

并发是一个很酷的话题&#xff0c;一旦你掌握了它&#xff0c;就会成为一笔巨大的财富。说实话&#xff0c;我一开始很害怕写这篇文章&#xff0c;因为我自己直到最近才对并发性不太适应。我已经掌握了基础知识&#xff0c;所以我想帮助其他初学者学习Go的并发性。这是众多并发…

Java SWT Composite 绘画

Java SWT Composite 绘画 1 Java SWT2 Java 图形框架 AWT、Swing、SWT、JavaFX2.1 Java AWT (Abstract Window Toolkit)2.2 Java Swing2.3 Java SWT (Standard Widget Toolkit)2.4 Java JavaFX 3 比较和总结 1 Java SWT Java SWT&#xff08;Standard Widget Toolkit&#xff…

C++从零开始的打怪升级之路(day30)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于list的基本函数使用 list是一个双向带头循环的…

02 使用jdk运行第一个java程序:HelloWorld

使用jdk运行第一个java程序 1 HelloWorld小案例1.1 编写流程1.2 错误示例 首先在CMD命令行里面&#xff0c;使用javac xxxx.java&#xff0c; 进行编译&#xff0c;其中会有报错&#xff1b; 然后生成xxxx.class 文件&#xff0c;然后使用java xxxx.class 进行运行。 1 HelloWo…

瑞_23种设计模式_抽象工厂模式

文章目录 1 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 案例需求2.2 代码实现 3 案例二3.1 需求3.2 实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式VS工厂方法模式4.4 抽象工厂…

node.js基础--01

Author nodes&#xff1a;&#xff08;题记&#xff09; node.js is an open-source&#xff0c;cross-platform JAVAScript runtime environment。 node.js是一个开源&#xff0c;跨平台的js运行环境 common commands&#xff08;常用指令&#xff09; 1、C: enter hard …

javaScript的序列化与反序列化

render函数的基本实现 javaScript的序列化与反序列化 一&#xff0c;js中的序列化二&#xff0c;序列化三&#xff0c;反序列化四&#xff0c;总结 一&#xff0c;js中的序列化 js中序列化就是对象转换成json格式的字符串&#xff0c;使用JSON对象的stringify方法&#xff0c;…

新书速览|Python数据科学应用从入门到精通

系统教授数据科学与Python实战&#xff0c;涵盖线性回归、逻辑回归、决策树、随机森林、神经网 本书内容 随着数据存储、数据处理等大数据技术的快速发展&#xff0c;数据科学在各行各业得到广泛的应用。数据清洗、特征工程、数据可视化、数据挖掘与建模等已成为高校师生和职场…

Socket.D v2.3.9 发布(增加 node.js server 适配)

Socket.D 是基于"事件"和"语义消息""流"的网络应用层传输协议。有用户说&#xff0c;“Socket.D 之于 Socket&#xff0c;尤如 Vue 之于 Js、Mvc 之于 Http”。支持 tcp, udp, ws, kcp 传输。协议特点可参考《官网介绍》。 pyton 已开发完成&a…