【堆 优先队列】1354. 多次求和构造目标数组

本文涉及知识点

堆 优先队列

LeetCode1354. 多次求和构造目标数组

给你一个整数数组 target 。一开始,你有一个数组 A ,它的所有元素均为 1 ,你可以执行以下操作:
令 x 为你数组里所有元素的和
选择满足 0 <= i < target.size 的任意下标 i ,并让 A 数组里下标为 i 处的值为 x 。
你可以重复该过程任意次
如果能从 A 开始构造出目标数组 target ,请你返回 True ,否则返回 False 。
示例 1:
输入:target = [9,3,5]
输出:true
解释:从 [1, 1, 1] 开始
[1, 1, 1], 和为 3 ,选择下标 1
[1, 3, 1], 和为 5, 选择下标 2
[1, 3, 5], 和为 9, 选择下标 0
[9, 3, 5] 完成
示例 2:
输入:target = [1,1,1,2]
输出:false
解释:不可能从 [1,1,1,1] 出发构造目标数组。
示例 3:
输入:target = [8,5]
输出:true

提示:
N == target.length
1 <= target.length <= 5 * 104
1 <= target[i] <= 109

优先队列

性质一:任何时候构造的数组arr,任意元素都大于>0。下面用数学归纳法证明:
一,初始状态全部为1,符合。
二,假定操作前符合,则操作后也符合。操作前符合,意味者其和大于0,即修改后arr[i]的值大于0。
如果长度为1 ,target[0]等于1则可以构造,否则不能构造。故下文只讨论n >=2。
性质二:根据性质一,n>=2,操作后,最大值一定会越来越大,且不会存在和最大值相同的其它值。
某处操作后,最大值的下标为i1,值为max1,和为sum1。则arr[i1]操作之前的值为 arr[i1] 为: max1 - (sum1-max1)
这样做会超时,比如:[109,1]会执行109次。
改成:

const int canSub = heap.top() - 1;
const int cnt = canSub / (sum - heap.top());if (cnt < 1) { return false; }const auto old = heap.top() - (sum - heap.top())* cnt;

时间复杂度 :O(logn l o g 1.5 ∑ ( t a r g e t ) log_{1.5}{\sum(target)} log1.5(target))
如果cnt为1 ,总和至少减少三分之一。
cnt为2,至少减少二分之一。
总而言之,每次操作总和会减少1。

代码

将所有数据放到大根堆heap中,sum是大根堆中数据之和。不断执行 上述操作,直到 heap.top()为1。
target全为1,也无需特殊处理。
初始heap全部是正数,修改后新增的值也为正数,故:sum1- heap.top()必定大于0。
由于heap中的数只会越来越小,故 heap中的数永远小于等于109,故canSub-1一定在int范围内。

核心代码

class Solution {
public:bool isPossible(vector<int>& target) {priority_queue<int> heap;long long sum = 0;for (const auto& n : target) {heap.emplace(n);sum += n;}if (1 == heap.size()) { return 1 == heap.top(); }while (1 != heap.top()) {				const int canSub = heap.top() - 1;const int cnt = canSub / (sum - heap.top());if (cnt < 1) { return false; }const auto old = heap.top() - (sum - heap.top())* cnt;sum -= heap.top();heap.pop();sum += old;heap.emplace(old);}return true;}
};

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

《财经态度》︱行业领跑品牌格行创始人刘永先独家揭秘:格行随身WiFi如何抗内卷,成就品质与服务双重骄傲?随身WiFi推荐第一名!

近两年人们对无线连接的需求急剧增加&#xff0c;特别是在旅行、出差、户外活动等场景下&#xff0c;随身WiFi以其便捷性、高效性和广泛适应性&#xff0c;成为满足这一需求的理想选择。随之而来的&#xff0c;随身WiFi竞争也日益激烈。众多厂商纷纷涌入&#xff0c;通过技术创…

Windows 下安装 Memcached

Memcached 安装包下载 官网上并未提供 Memcached 的 Windows 平台安装包。 我们可以使用以下链接来下载&#xff0c;你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可&#xff1a; 32位系统 1.2.5版本&#xff1a;http://static.jyshare.com/download/memcache…

【Vue3】使用vite创建vue项目

一、安装Nodejs 参考文章https://blog.csdn.net/DX390609/article/details/140305585?spm1001.2014.3001.5502 二、创建项目 在要创建的目录下打开命令行输入&#xff1a; npm create vuelatestvue项目创建成功&#xff1a; 三、安装vue插件 vscode打开项目文件夹&…

【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——红黑树

目录 1 -> 红黑树 1.1 -> 红黑树的概念 1.2 -> 红黑树的性质 1.3 -> 红黑树节点的定义 1.4 -> 红黑树的结构 1.5 -> 红黑树的插入操作 1.6 -> 红黑树的验证 1.8 -> 红黑树与AVL树的比较 2 -> 红黑树模拟实现STL中的map与set 2.1 -> 红…

【代码随想录07】344.反转字符串 541. 反转字符串II 54.替换数字

目录 344. 反转字符串题目描述做题思路参考代码 541. 反转字符串 II题目描述参考代码 54. 替换数字题目描述参考代码 344. 反转字符串 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空…

昇思25天学习打卡营第17天|应用实践之SSD目标检测

基本介绍 今天要学习的内容是计算机视觉领域中的目标检测任务。与图像分类相比&#xff0c;目标检测更难&#xff0c;因为目标检测不仅要检测出图片中的物体的类别&#xff0c;还要检测出该物体的位置。现主流的目标检测算法大致可分为两种&#xff0c;一种是基于CNN的&#xf…

UML时序图的绘制

一分钟学会绘制时序图 目录 1、简单了解时序图元素 2、进入实例理解 实例1 实例2 3、四种常用的组合片段 Opt:包含一个可能发生或不发生的序列 Alt:片段中两个只会发生其一 Loop:片段可重复一定次数 Par:片段中事件可多线程并行处理 4、分清几个消息 同步消息&#…

【CUDA】 Trust基本特性介绍及性能分析

Trust简介 Thrust 是一个实现了众多基本并行算法的 C 模板库,类似于 C 的标准模板库(standard template library, STL)。该库自动包含在 CUDA 工具箱中。这是一个模板库,仅仅由一些头文件组成。在使用该库的某个功能时,包含需要的头文件即可。该库中的所有类型与函数都在命名空…

体验完这款售价29999元起苹果新品,我大受震撼

讲道理&#xff0c;数码圈已经很久没有出现过让人耳目一新的产品了。 整个圈子近些年各家新品逻辑给我的一种感觉是普遍主打循规循距&#xff0c;用高情商话来说那叫稳扎稳打不易出错&#xff0c;而低情商嘛&#xff0c;说白了叫创新精神严重缺失。 「科技最后以换皮为准」这…

Java 8革新:现代编程的全新标准与挑战

文章目录 一、方法引用二、接口默认方法三、接口静态方法四、集合遍历forEach()方法 一、方法引用 方法引用是Java 8中一种简化Lambda表达式的方式&#xff0c;通过直接引用现有方法来代替Lambda表达式。 方法引用使得代码更加简洁和易读&#xff0c;特别是在处理函数式接口时&…

揭秘小红书矩阵系统:源码助力一键自动发布,多平台管理,效率飙升!

在数字化时代&#xff0c;社交媒体已成为品牌和个人展示自我、推广产品的重要舞台。小红书&#xff0c;作为备受年轻人喜爱的社交平台&#xff0c;其影响力不容小觑。然而&#xff0c;面对日益激烈的竞争&#xff0c;如何高效地在小红书上发布内容、管理多平台账号&#xff0c;…

数模打怪(一)之层次分析法

一、什么是层次分析法 层次分析法&#xff08;AHP&#xff09;主要用于解决评价类问题&#xff08;可打分&#xff09; 比如哪种方案更好、哪位运动员更优秀等 二、层次分析法的三个步骤 1、建立层次结构 分析题目&#xff0c;找出评价类问题的三要素&#xff1a; &#x…

通过Xftp向linux系统传文件,出现Permission is not allowed错误怎么办?

使用xftp出现如下情况&#xff0c;就是说明权限不够。什么权限呢&#xff1f;是我们准备传输的linux系统上面的目标文件夹的权限不够&#xff0c;给linux上面这个目标文件夹提升权限即可。 注意点&#xff1a; 777后面跟的是目录名&#xff0c;比如你想往/usr/local/src这个目…

MySQL 数据库基础概念

一、什么是数据库&#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也可以将数据存储在文件中&…

用python生成词频云图(python实例二十一)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.词频云图 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&a…

Python导包问题

文章目录 1问题背景2参考资料及分析3可以兼顾的方法 1问题背景 需要在当前文件中导入当前文件的上级目录下某个文件夹中的文件&#xff0c;如下图所示 即在CBOW.py文件中导入utils\Embedding.py文件中的类&#xff1b; 2参考资料及分析 如何将Python的上级目录的文件导入&am…

react基础语法,模板语法,ui渲染,jsx,useState状态管理

创建一个react应用 这里使用create-react-app的脚手架构建项目&#xff08;结构简洁&#xff0c;基于webpack-cli&#xff09;&#xff0c; npx create-react-app [项目名称] 使用其他脚手架构建项目可以参考&#xff1a;react框架&#xff0c;使用vite和nextjs构建react项目…

数学建模国赛入门指南

文章目录 认识数学建模及国赛认识数学建模什么是数学建模&#xff1f;数学建模比赛 国赛参赛规则、评奖原则如何评省、国奖评奖规则如何才能获奖 国赛赛题分类及选题技巧国赛赛题特点赛题分类 国赛历年题型及优秀论文数学建模分工技巧数模必备软件数模资料文献数据收集资料收集…

【7月长沙】2024年土木、水利与智能建造国际会议(CHEIC 2024)

在21世纪的今天&#xff0c;随着科技的迅猛发展&#xff0c;土木工程、水利工程与智能建造领域正迎来前所未有的变革。为了汇集全球范围内的智慧&#xff0c;推动这一领域的进步与发展&#xff0c;土木、水利工程与智能建造国际会议&#xff08;CHEIC 2024&#xff09;应运而生…

华为浏览器,Chrome的平替,插件无缝连接

文章目录 背景插件书签 背景 不知道各位小伙伴有没有这样的痛点&#xff0c;办公电脑、家里的电脑还有手机、平板等&#xff0c;收藏了一个网址或者在手机上浏览了某个网页&#xff0c;保存起来&#xff0c;可是一换平台或者换个电脑&#xff0c;在想要浏览之前收藏的东西&…