LeetCode 3266.K 次乘运算后的最终数组 II:堆(快速幂)

【LetMeFly】3266.K 次乘运算后的最终数组 II:堆(快速幂)

力扣题目链接:https://leetcode.cn/problems/final-array-state-after-k-multiplication-operations-ii/

给你一个整数数组 nums ,一个整数 k  和一个整数 multiplier 。

你需要对 nums 执行 k 次操作,每次操作中:

  • 找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。
  • x 替换为 x * multiplier 。

k 次操作以后,你需要将 nums 中每一个数值对 109 + 7 取余。

请你返回执行完 k 次乘运算以及取余运算之后,最终的 nums 数组。

 

示例 1:

输入:nums = [2,1,3,5,6], k = 5, multiplier = 2

输出:[8,4,6,5,6]

解释:

操作结果
1 次操作后[2, 2, 3, 5, 6]
2 次操作后[4, 2, 3, 5, 6]
3 次操作后[4, 4, 3, 5, 6]
4 次操作后[4, 4, 6, 5, 6]
5 次操作后[8, 4, 6, 5, 6]
取余操作后[8, 4, 6, 5, 6]

示例 2:

输入:nums = [100000,2000], k = 2, multiplier = 1000000

输出:[999999307,999999993]

解释:

操作结果
1 次操作后[100000, 2000000000]
2 次操作后[100000000000, 2000000000]
取余操作后[999999307, 999999993]

 

提示:

  • 1 <= nums.length <= 104
  • 1 <= nums[i] <= 109
  • 1 <= k <= 109
  • 1 <= multiplier <= 106

解题方法:堆 + 快速幂

对于两个数 x < y x\lt y x<y,如果 x × m u l t i p l i e r > y x\times multiplier\gt y x×multiplier>y,那么下次选择将会是 y y y,而 y × m u l t i p l i e r y\times multiplier y×multiplier后又会大于 x × m u l t i p l i e r x\times multiplier x×multiplier,下下次将会选择的是 x x x,然后是 y y y,…

也就是说,两个数较为接近后(之间的倍数小于 m u l t i p l i e r multiplier multiplier),将会每个数依次被选中。

多个数也一样,假设多个数中最大的数是 M M M,当 M M M第一次变成最小的数时,其他所有的数都 ≥ M \geq M M < M × m u l t i p l i e r \lt M\times multiplier <M×multiplier。也就是说这时候所有的数都会比较接近,所有的数会像前面例子中的 x x x y y y一样依次被选中。

假设此时还剩 k k k次操作,那么:

  • k % n k\% n k%n小的数还会被执行 ⌊ k n ⌋ + 1 \lfloor\frac{k}{n}\rfloor+1 nk+1次操作;
  • 其余数还会被执行 ⌊ k n ⌋ \lfloor\frac{k}{n}\rfloor nk次操作。

对于 M M M变成最小数之前的操作,我们可以使用堆或优先队列模拟进行;

对于之后的操作,可以使用快速幂来计算。

时空复杂度分析

  • 时间复杂度 O ( n log ⁡ n log ⁡ m M ) O(n\log n\log_mM) O(nlognlogmM)。单个数最多被模拟 log ⁡ m M \log_m M logmM次,最多模拟 n n n个数,单次模拟时间复杂度 O ( log ⁡ n ) O(\log n) O(logn)
  • 空间复杂度 O ( n ) O(n) O(n)

其中 m = m u l t i p l i e r m=multiplier m=multiplier n = l e n ( n u m s ) n=len(nums) n=len(nums) M = max ⁡ ( n u m s ) M=\max(nums) M=max(nums)

m = 1 m=1 m=1则可立即返回原数组,否则 m m m至少为 2 2 2 M M M最大为 1 0 9 10^9 109 n n n最大为 1 0 4 10^4 104 max ⁡ ( n log ⁡ n log ⁡ m M ) = 1 0 4 × log ⁡ 1 0 4 × log ⁡ 1 0 9 \max(n\log n\log_mM)=10^4\times \log 10^4\times \log 10^9 max(nlognlogmM)=104×log104×log109= 1 0 4 × 13.288 × 29.897 = 3972713.36 ≈ 4 × 1 0 6 10^4\times 13.288\times 29.897=3972713.36\approx4\times 10^6 104×13.288×29.897=3972713.364×106

这数据范围不错。

AC代码

C++
/** @Author: LetMeFly* @Date: 2024-12-14 15:12:15* @LastEditors: LetMeFly.xyz* @LastEditTime: 2024-12-14 17:42:05*/
#ifdef _WIN32
#include "_[1,2]toVector.h"
#endif/* 
1 3 5 6
2min
2 3 5 6            0
4 3 5 6            1
4 6 5 6            0
8 6 5 6            2
8 6 10 6           1
8 12 10 6          3
8 12 10 12         0
16 12 10 12        2
16 12 20 12        1
16 24 20 12        3
16 24 20 24        0
...
*/
typedef long long ll;
const ll MOD = 1e9+7;
class Solution {
private:ll pow(ll a, ll b) {ll ans = 1;while (b) {if (b & 1) {ans = (ans * a) % MOD;}a = (a * a) % MOD;b >>= 1;}return ans;}
public:vector<int> getFinalState(vector<int>& nums, int k, int multiplier) {if (multiplier == 1) {return nums;}vector<pair<ll, int>> h;for (int i = 0; i < nums.size(); i++) {h.push_back({nums[i], i});}make_heap(h.begin(), h.end(), greater<>());ll M = *max_element(nums.begin(), nums.end());for (; k && h[0].first < M; k--) {pop_heap(h.begin(), h.end(), greater<>());h.back().first *= multiplier;  // 这里不能取模,因为取模后可能导致一个本来大于M的数又小于M了。push_heap(h.begin(), h.end(), greater<>());}sort(h.begin(), h.end());for (int i = 0; i < h.size(); i++) {auto& [val, index] = h[i];nums[index] = val % MOD * pow(multiplier, k / nums.size() + (i < k % nums.size())) % MOD;}return nums;}
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/144473973

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

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

相关文章

【YashanDB知识库】oracle与yashanDB的jdbc返回常量列“0.00“的精度和刻度不一致

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7610110.html?templateId1718516 问题现象 客户预期常量列"0.00"应该映射到java里的浮点类型&#xff0c;结果却是跑到整型。 1、应用的sql 2、应用的java代码 3、执行结果…

Ripro V5日主题 v8.3 开心授权版 wordpress主题虚拟资源下载站首选主题模板

RiPro主题全新V5版本&#xff0c;是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置&#xff0c;让您的网站设计体验更加舒适。同时支持了高级筛选、自带会员生态系统、超全支付接口等众多功能&#…

前端页面图片滑动验证

开源项目地址&#xff1a;monoplasty/vue3-slide-verify 安装命令&#xff1a; npm install --save vue3-slide-verify 在登录页面添加代码&#xff1a; <template> <!-- 登录验证码对话框 --> <el-dialog v-model"dialogVisible" title"验…

pyhton 批量往PDF文件指定位置里面填写数据

pyhton 批量往PDF文件指定位置里面填写数据 import PyPDF2 from PyPDF2 import PdfReader, PdfWriterdef modify_pdf(input_pdf_path, output_pdf_path, page_number, x, y, text):reader PdfReader(input_pdf_path)writer PdfWriter()for page in reader.pages:writer.add_p…

MySQL迁移SQLite 借助PYTHON脚本

使用 Python 脚本将 MySQL 数据库迁移到 SQLite 是一种灵活且强大的方法。 下面是一个基本的脚本示例&#xff0c;使用 pandas 和 sqlite3 库来实现这一过程。 这个脚本假设你已经安装了 pandas 和 mysql-connector-python 库。 步骤 安装必要的库: 如果尚未安装&#xff…

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…

县城楼市踩踏式降价,或现2字头,率先回归月薪一平方的合理价格

在一二线城市都在欢呼10月份、11月份成交量回升&#xff0c;楼价回稳的时候&#xff0c;广东一些县城却先顶不住了&#xff0c;大举降价&#xff0c;显示出县城楼市房价率先回归月薪一平方的合理水平&#xff0c;这将对全国楼市产生巨大影响。 据了解这个县城的楼价此前较为稳定…

【前端面试题】书、定位问题、困难

看过什么书 《JavaScript 高级程序设计&#xff08;第 4 版&#xff09;》&#xff08;作者&#xff1a;Matt Frisbie&#xff09; 这是一本深入学习 JavaScript 语言的经典书籍。它详细地涵盖了 JavaScript 的高级特性&#xff0c;包括原型链、闭包、异步编程等复杂概念。以闭…

利用Docker分层构建优化镜像大小

合适docker镜像文件大小不仅影响容器启动效率&#xff0c;也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像&#xff0c;采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…

深度学习面试相关-2024.12.15记录

深度学习 面试相关- 2024.12.15记录 目录 深度学习 面试相关- 2024.12.15记录整体常问问题1数学基础1.1 概率统计1.2 线代 2机器学习算法2.1 深度学习算法2.2 机器学习算法 整体常问问题 https://www.nowcoder.com/discuss/353154899112304640 1数学基础 1.1 概率统计 htt…

大模型呼出机器人能够解决哪些问题?

大模型呼出机器人能够解决哪些问题&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼出机器人作为现代科技在客户服务领域的创新应用&#xff0c;能够解决多个方面的问题&#xff0c;以下是…

Python面试常见问题及答案4

一、内存管理相关 问题&#xff1a;Python中的垃圾回收机制是如何工作的&#xff1f; 答案&#xff1a;Python主要使用引用计数来进行垃圾回收&#xff0c;当对象的引用计数为0时&#xff0c;该对象就会被垃圾回收器回收。此外&#xff0c;Python还有一个循环垃圾收集器来处理循…

从零用java实现 小红书 springboot vue uniapp (2)主页优化

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了主页的布局 今天我们具体的去进行实现 并且分享我开发时遇到的问题 首先先看效果 java仿小红书主页 实现效果为 1.顶端全屏切换 2.上划加载更多 3.下拉当前页整体刷新 顶端全屏切换我们选择 gui-switch…

idea 配置 git .gitignore文件配置

.gitignore 内容 .idea/ *.iml target/ *.class *.log .iml在idea项目里面创建一个.gitignore名字的文件&#xff0c;然后把这个文件提交到git上。我一般是放到.idea同级目录。 我遇到了几种情况这个文件配置了但是不生效的情况 第一种 Git的缓存可能会导致配置不生效。尝试…

linux 下nmcli命令使用方法

1、nmcli 是 NetworkManager Command Line Interface 的缩写。 详细解释 NetworkManager: 是 Linux 上常用的网络管理工具&#xff0c;负责管理有线、无线、VPN 等网络连接。 Command Line Interface (CLI): 意味着 nmcli 是 NetworkManager 的命令行界面工具&#xff0c;提…

双指针---移动0

常见的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是快慢指针。 这里写自定义目录标题 题目链接 [移动0](https://leetcode.cn/problems/move-zeroes/description/)问题分析代码解决 题目链接 移动0 问题分析 在本题中&#xff0c;我们可以⽤⼀个 cur 指针来…

《智能体开发实战(高阶)》四、系统化的日志周报智能体开发计划

智能体扩展与完善规划 为了将前几个章节的智能体逐步扩展为支持整个公司团队使用的高效工具,以下是分阶段的完善与扩写规划。每个阶段旨在提升功能覆盖范围、处理能力和用户体验,并为企业提供实际价值。 阶段一:基础功能完善 目标:巩固现有功能,提升健壮性和适用性。 支…

linux从frame buffer中将qt界面拷贝出来放到u盘的操作方法

使用的是gsnap工具&#xff0c;源码可以在百度上搜,以Imx6为例的使用方法 rootimx6qsabresd:~# rootimx6qsabresd:~# rootimx6qsabresd:~# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 289293 197510 76423 73% / devtmpfs …

Python+OpenCV系列:滤波器的魔力

滤波器是图像处理领域中不可或缺的工具。无论是去除噪声、锐化图像还是提取特征&#xff0c;滤波器都扮演着重要角色。本篇将从简单到复杂&#xff0c;带你快速掌握 PythonOpenCV 中的滤波器使用技巧。 什么是滤波器&#xff1f; 滤波器是一种对图像像素值进行计算、平滑或增强…

Android 使用 Gson + OkHttp 实现 API 的常规使用(个人心得)

学习笔记 一、依赖和权限的添加 网络权限: 在 Android 中进行网络请求时,必须声明权限,确保应用具有访问互联网的能力。 <uses-permission android:name="android.permission.INTERNET"/> 依赖项: 确保在 build.gradle 中添加以下依赖: dependencies …